Écrivez un programme dans la langue de votre choix qui joue un jeu parfait de tic-tac-toe sur un tableau 3 * 3 contre un joueur humain. Cependant, chaque mouvement doit être un programme différent , généré à partir de l'itération précédente.
La façon dont vous évaluez la contribution humaine et la forme sous laquelle vous l'évaluez dépendent de vous, mais elle doit être lue à partir de la saisie standard. De même, vous êtes libre de choisir une méthode pour déterminer quel joueur commencera (par exemple, vous demandez d'abord, ou vous permettez à l'humain d'entrer un mouvement invalide pour signaler que l'ordinateur démarre, ou d'autres idées).
La validation des mouvements n'est pas nécessaire, vous pouvez supposer un adversaire humain assez joueur.
Fondamentalement, vous avez un programme qui correspond à un état de la carte. L'état est imprimé de n'importe quelle manière reconnaissable, mais au moins le niveau de détail suivant est attendu:
X..
00X
x..
Une fois que le joueur humain a entré ses mouvements, votre programme doit générer la prochaine itération de lui-même en tant que fichier source dans la même langue (soit vers la sortie standard, soit vers un fichier) et se terminer. Vous n'êtes pas autorisé à stocker des informations ailleurs que dans ce fichier source. (il n'est pas nécessaire que votre programme crée et exécute le programme généré, cela peut être fait par l'utilisateur - cependant, ce n'est pas interdit). Lorsque le programme généré est construit et exécuté, il se comportera de manière similaire, affichera l'état, attendra l'entrée de l'utilisateur, etc.
À la fin du jeu, vous devez imprimer le résultat (que vous ayez gagné ou que ce soit une égalité) de manière identifiable sans ambiguïté.
Par jeu parfait, je veux dire que le programme ne doit pas perdre, et s'il y a une possibilité de forcer une victoire, elle devrait gagner.
Le code le plus court gagne , le gagnant est sélectionné au moins 10 jours après la première entrée valide.
Vous obtenez une réduction de 10% du score si votre programme peut gérer la construction et le lancement de sa prochaine itération. (Je sais, cela n'en vaut probablement pas la peine) Bien sûr, le programme lui-même doit être terminé au moment où la prochaine itération accepte les mouvements de l'utilisateur.
Si vous utilisez des trucs étranges et inhabituels, veuillez poster une courte explication avec votre code.