Un TicTacToejuego puede ser representado por una cadena que denota la secuencia de posiciones a medida que los jugadores hacen su movimiento.
0 1 2 3 4 5 6 7 8
Suponga que Xsiempre juega primero.
Entonces una cadena de "012345678" denota el juego
XOX OXO XOX
Tenga en cuenta que el juego ya está ganado cuando el jugador Xmarca 6, en ese punto el juego termina, otorgando una victoria a X. (es decir, ignorar los movimientos restantes una vez que un jugador gana)
Su desafío (código) es imprimir todos los juegos (orden ordenado) y sus resultados.
El formato
<movesequence>:<result>\n
p.ej:
012345678:X
012345687:X
012345768:X
...
Denota Xpara el primer jugador ganador, Opara el segundo jugador y Dpara los sorteos.
Habrá 9!(362880) juegos.
Aquí hay algunos datos para verificar sus resultados.
'X' Wins: 212256
'O' Wins: 104544
Draws : 46080
Este es un codegolf, y el tiempo de ejecución debe ser dentro de un minuto. ¡Que te diviertas!
EDITAR: eliminó el exceso de detalles e imprímalo stdout. No es necesario crear un archivo.

Respuestas:
Ruby 1.9, 201 caracteres
Ligeramente golf hasta ahora. Tarda unos 45 segundos en completarse aquí.
fuente
J, 124 caracteres
X gana, O gana y el sorteo cuenta.
Sin embargo, fue un poco doloroso de depurar. :)
fuente
Haskell,
224222 caracteresPor desgracia, la
permutationsfunción deData.Listno produce permutaciones en orden lexográfico. Así que tuve que gastar 6 personajes en el género.fuente
APL (139)
Esto probablemente se puede acortar más, pero ya es bastante difícil. Lo creas o no, se ejecuta en aproximadamente 45 segundos en mi computadora (excluyendo el tiempo que toma enviar todo, cuando sale a la pantalla).
Explicación:
M←⍳9: Almacene en M los números del 1 al 9. Internamente, este programa usa 1..9 en lugar de 0..8.{...}: una función para obtener todas las permutaciones:1≥⍴⍵:↑,↓⍵: si la longitud es menor o igual a 1, devuelve el argumento como una matriz.⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵: de lo contrario, elimine cada carácter⍵de⍵, obtenga las permutaciones de eso y agregue el carácter nuevamente.¨↓: para cada permutación ...{...}: una función que le da al ganador esa permutación:⊃,/(,/⍕¨⍵-1),':',{...}⍵: obtenga la permutación como una cadena, con todos los números disminuidos en 1 (para obtener la salida requerida de 0..8 en lugar de 1..9), seguido de dos puntos, seguido del carácter que indica el ganador:⍉5 2⍴0,⍨⍵: separa los movimientos de X de los movimientos de O. Debido a que O tiene un movimiento menor que X, ese espacio se llena con lo0que no se utiliza y, por lo tanto, no influye en el resultado.{...}¨↓: tanto para el tablero X como para el tablero O, ejecute la siguiente función que determina si hay una victoria en uno de los nueve pasos:(M∘.≥M)∧[2]M∊⍵: Genere un bitboard a partir de los números de movimiento, yandeste bitboard con las cadenas de bits100000000,110000000...111111111para obtener el estado del tablero en cada uno de los nueve momentos en el tiempo.{...}¨↓: para cada uno de estos, ejecute la siguiente función:⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔': obtener los bitboards para cada posible situación ganadora⍵∘{⍵≡⍵∧⍺}¨↓:andcada estado ganador con el bitboard actual y verifique si dicho estado ganador todavía está allí∨/↑:orestos juntos, dando si hay una victoria en este bitboard1∊T←↑: haga una matriz de 9x2, con los 9 pasos X en la primera fila y los 9 pasos O en la segunda fila. Almacene esto en T. Si hay un 1 en esta matriz, alguien ha ganado.:'XO'[1+</+/T]: Si alguien ha ganado, dé 'X' u 'O' dependiendo de quién1fue primero.⋄'D': Si nadie ha ganado, dé 'D'.↑: haga una matriz de estos para que se muestren en una fila separada.fuente
Python Ungolfed
fuente
permutationsC ++ sin golf
fuente
Python 2.7 (237)
fuente