Ce défi consiste à écrire une fonction minimax dans la langue de votre choix, pour générer le prochain meilleur mouvement dans un jeu NxN de tic-tac-toe étant donné l' état actuel de la carte . L'entrée du tableau peut être acceptée en tant que matrice, collection 2D ou tout autre élément qui a du sens pour vous, mais qui respecte les règles . La sortie étant le prochain meilleur coup pour le tour de celui qui est actuellement , où X est considéré comme ayant commencé .
Contexte rapide de l'algorithme Minimax
L'idée de base de l'algorithme minimax est d'énumérer tous les résultats possibles en tant que DAG, puis de les pondérer par l'avantage que la séquence de mouvements a pour le joueur, déterminé par le premier mouvement effectué. Tous les résultats possibles sont ensuite «regroupés» par le premier coup et sont notés sur la base de la somme de tous les résultats (-1 pour une défaite, 0 pour une égalité et 1 pour une victoire). Dans les implémentations qui nécessitent plusieurs joueurs pour jouer, vous énumérez tous les mouvements possibles du joueur, ainsi que toutes les réponses possibles des adversaires. Par exemple, dans un jeu de tic-tac-toe (après le premier coup), il y a 8 premiers coups possibles que vous pouvez faire, et ils peuvent tous sembler égaux lors de l'analyse du tour suivant uniquement. Mais en parcourant tous les résultats possibles pour chaque ensemble de mouvements possibles qui aboutit à un résultat final et en les résumant tous,
Pour un résumé meilleur, plus approfondi et contextuel de l'algorithme mini-max en termes de tic-tac-toe, lisez plus ici: http://neverstopbuilding.com/minimax
XKCD (solution 3x3 uniquement)
Les règles
- N'importe quel langage peut être utilisé, mais aucune bibliothèque minimax externe n'est autorisée.
- La sortie peut être une coordonnée (0-n, 0-n) ou un nombre (1-n * n) indiquant le meilleur mouvement suivant.
- En plus de cela, vous devez être en mesure d'identifier quand le meilleur scénario est une perte ou une égalité au lieu d'une victoire.
- La façon dont vous indiquez une perte ou une égalité est, encore une fois, à vous de décider.
- L'entrée doit utiliser les X et O traditionnels, et vous devez supposer que X se déplace en premier; les espaces vides peuvent être représentés par n'importe quoi.
- Vous pouvez supposer que toutes les entrées entrant dans votre programme ont n O et n + 1 X, en d'autres termes, vous pouvez supposer que vous obtenez une carte bien formée.
- L'état actuel de la carte doit être la seule entrée de votre programme, si vous utilisez la récursivité, des méthodes d'assistance doivent être mises en place pour faciliter les exigences d'entrée. Voir /codegolf//a/92851/59376 pour des éclaircissements.
- Toute valeur de 10> = n> = 1 doit être prise en charge; si votre programme "arrive à expiration" pour n> 10, je trouve cela également acceptable, car certaines langues ont une puissance de traitement considérablement inférieure (en particulier en utilisant des consoles Web).
Juger
- Il s'agit de code-golf, donc le nombre d'octets le plus bas du programme gagne et les failles standard sont universellement interdites.
- En cas d'égalité, le programme qui prend en charge le plus grand «n» l'emportera.
Exemples d'entrées
2x2
[[X,O]
[-,-]]
Sortie: 2 ou [0,1] (3 ou [1,1] serait également sans doute correct) (Une forme d'indication de l'emplacement, arbitraire tant que vous pouvez facilement expliquer le format que vous avez utilisé)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
Sortie: -1 (perte)
Encore une fois, tout format d'entrée que vous voulez est autorisé, mais les X et les O doivent être utilisés, les exemples fournis n'étaient pas destinés à contraindre à ce format, juste pour inspirer.
la source
Réponses:
Perl,
10198 octetsComprend
+4
pour-0p
Exécuter avec l'entrée sur STDIN
La sortie est le même diagramme, mais à chaque mouvement mis à jour avec son statut,
1
représente une victoire,2
représente un match nul et3
représente une perte. Pour ce cas, ce seraitdonc 3 coups tirent, 1 gagne et 1 perd (je mettrai à jour la solution si ce format de sortie est inacceptable, mais le code de base restera le même)
tictactoe.pl
:C'est déjà douloureusement lent et utilise beaucoup de mémoire pour la carte 3 * 3 vide (pourquoi en fait, la récursivité ne va pas aussi loin. Doit être une fuite de mémoire). L'ajout de la mémorisation coûte 6 octets mais est beaucoup plus sain:
la source
do$0
utiliserait 10 fois moins de mémoire. Attention, ce cas est si extrême qu'il pourrait en fait s'agir d'une véritable fuite de mémoire.Javascript (ES6),
320294 octetsContribution
1) Un tableau de tableau de caractères décrivant la carte actuelle, comme:
2) Un entier décrivant le tour en cours: 1 =
X
, -1 =O
Production
Un tableau composé de:
[x, y]
formatExemple
Dans l'exemple suivant, il
X
est garanti de gagner en jouant[1, 2]
.UN JEU ÉTRANGE. LE SEUL MOUVEMENT GAGNANT N'EST PAS JOUÉ.
QU'EN EST-IL D'UN BON JEU D'ECHECS?
la source
The current state of the board must be the only input to your program
. Votre code a besoin de deux entrées, ce qui enfreint cette règle.