Un TicTacToe
jeu peut être représenté par une chaîne indiquant la séquence de positions au fur et à mesure que les joueurs se déplacent.
0 1 2 3 4 5 6 7 8
Supposons que X
joue toujours en premier.
Donc, une chaîne de "012345678" indique le jeu
XOX OXO XOX
Remarquez que le jeu est déjà gagné lorsque le joueur X
marque 6
, à ce stade, le jeu se termine, accordant une victoire à X
. (c.-à-d. ignorer les coups restants une fois qu'un joueur gagne)
Votre défi (code) est d'imprimer tous les jeux (ordre trié) et ses résultats.
Le format
<movesequence>:<result>\n
par exemple:
012345678:X
012345687:X
012345768:X
...
Indique X
le premier joueur gagnant, O
le deuxième joueur et les D
tirages.
Il y aura 9!
(362880) matchs.
Voici quelques données pour vérifier vos résultats.
'X' Wins: 212256
'O' Wins: 104544
Draws : 46080
Il s'agit d'un codegolf et l'exécution devrait durer une minute. S'amuser!
EDIT: Suppression des détails en excès, et imprimez-le simplement stdout
. Pas besoin de créer un fichier.
Réponses:
Ruby 1.9, 201 caractères
Légèrement joué jusqu'à présent. Prend environ 45 secondes pour terminer ici.
la source
J, 124 caractères
X gagnent, O gagnent et tirent les décomptes.
C'était un peu pénible à déboguer cependant. :)
la source
Haskell,
224222 caractèresHélas, la
permutations
fonction fromData.List
ne produit pas de permutations dans l'ordre lexographique. J'ai donc dû dépenser 6 caractères sur le tri.la source
APL (139)
Cela peut probablement être raccourci davantage, mais c'était déjà assez difficile. Croyez-le ou non, il s'exécute en environ 45 secondes sur mon ordinateur (à l'exclusion du temps qu'il faut pour tout sortir, lors de la sortie sur l'écran).
Explication:
M←⍳9
: Stockez en M les nombres de 1 à 9. En interne, ce programme utilise 1..9 au lieu de 0..8.{
...}
: une fonction pour obtenir toutes les permutations:1≥⍴⍵:↑,↓⍵
: si la longueur est inférieure ou égale à 1, retournez l'argument sous forme de matrice.⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵
: dans le cas contraire, supprimez chaque caractère⍵
de⍵
, obtenez les permutations de celui-ci et ajoutez-le à nouveau.¨↓
: pour chaque permutation ...{
...}
: une fonction qui donne le vainqueur pour cette permutation:⊃,/(,/⍕¨⍵-1),':',{
...}⍵
: obtenez la permutation sous forme de chaîne, avec tous les nombres diminués de 1 (pour obtenir la sortie 0..8 requise au lieu de 1..9), suivi de deux points, suivi du caractère indiquant le gagnant:⍉5 2⍴0,⍨⍵
: séparez les coups par X des coups par O. Parce que O a un coup de moins que X, cet espace est rempli par0
, qui n'est pas utilisé et n'influence donc pas le résultat.{
...}¨↓
: pour la carte X et la carte O, exécutez la fonction suivante qui détermine s'il y a une victoire dans l'un des neuf pas de temps:(M∘.≥M)∧[2]M∊⍵
: Générez un bitboard à partir des numéros de mouvement, etand
ce bitboard avec les chaînes de bits100000000
,110000000
...111111111
pour obtenir l'état de la planche à chacun des neuf moments dans le temps.{
...}¨↓
: pour chacun d'eux, exécutez la fonction suivante:⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔'
: obtenez les bitboards pour chaque situation gagnante possible⍵∘{⍵≡⍵∧⍺}¨↓
:and
chaque état gagnant avec le bitboard actuel et vérifier si cet état gagnant est toujours là∨/↑
:or
ceux - ci ensemble, donnant s'il y a une victoire sur ce bitboard1∊T←↑
: créez une matrice 9x2, avec les 9 pas de temps X sur la première ligne et les 9 pas de temps O sur la deuxième ligne. Stockez-le dans T. S'il y a un 1 dans cette matrice, quelqu'un a gagné.:'XO'[1+</+/T]
: Si quelqu'un a gagné, donnez «X» ou «O» selon le1
premier.⋄'D'
: Si personne n'a gagné, donnez «D».↑
: créez une matrice à partir de celles-ci afin qu'elles s'affichent chacune sur une ligne distincte.la source
Python Ungolfed
la source
permutations
C ++ non golfé
la source
Python 2.7 (237)
la source