Escriba un programa en su idioma elegido que juegue un juego perfecto de tic-tac-toe en un tablero de 3 * 3 contra un jugador humano. Sin embargo, cada movimiento debe ser un programa diferente , generado a partir de la iteración anterior.
Depende de usted cómo y de qué forma evalúa el aporte humano, pero debe leerse a partir del aporte estándar. Del mismo modo, puede elegir un método para determinar qué jugador comienza (por ejemplo, pregunta primero, o permite que el humano ingrese un movimiento no válido para indicar que la computadora se inicia u otras ideas).
No es necesario validar movimientos, puedes asumir que eres un oponente humano que juega con justicia.
Básicamente, tiene un programa que corresponde a un estado del tablero. El estado se imprime de cualquier manera reconocible, pero al menos se espera el siguiente nivel de detalle:
X..
00X
x..
Después de que el jugador humano ingresó sus movimientos, su programa tiene que generar la siguiente iteración de sí mismo como un archivo fuente en el mismo idioma (ya sea a la salida estándar o a un archivo) y finalizar. No está permitido almacenar información en ningún otro lugar fuera de ese archivo fuente. (no es necesario que su programa compile y ejecute el programa generado, puede hacerlo el usuario; sin embargo, no está prohibido). Cuando el programa generado se construye y ejecuta, se comportará de manera similar, mostrará el estado, esperará la entrada del usuario, etc.
Al final del juego, debes imprimir el resultado (ya sea que hayas ganado o sea un empate) de una manera inequívocamente identificable.
Por juego perfecto quiero decir que el programa no debe perder, y si existe la posibilidad de forzar una victoria, debería ganar.
El código más corto gana , el ganador se selecciona al menos 10 días después de la primera entrada válida.
Obtiene una reducción del 10% en la puntuación si su programa puede manejar la construcción y el lanzamiento de su próxima iteración. (Lo sé, lo más probable es que no valga la pena). Por supuesto, el programa en sí debe estar terminado para cuando la próxima iteración acepte los movimientos del usuario.
Si usa algunos trucos extraños y poco comunes, publique una breve explicación con su código.