Un TicTacToe
juego 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 X
siempre 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 X
marca 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 X
para el primer jugador ganador, O
para el segundo jugador y D
para 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
permutations
función deData.List
no 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 lo0
que 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, yand
este bitboard con las cadenas de bits100000000
,110000000
...111111111
para 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⍵∘{⍵≡⍵∧⍺}¨↓
:and
cada estado ganador con el bitboard actual y verifique si dicho estado ganador todavía está allí∨/↑
:or
estos 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én1
fue 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
permutations
C ++ sin golf
fuente
Python 2.7 (237)
fuente