Este desafío es sobre el juego Tic Tac Toe, pero se juega en un toro.
Cómo jugar
Para crear el tablero de juego necesario, comienzas con un tablero de juego Tic Tac Toe normal. Primero dóblelo en un cilindro uniendo el borde izquierdo y el derecho. Luego dóblalo en toro uniendo los bordes superior e inferior. Aquí hay una visualización simple de tal tablero de juego con algunos movimientos jugados (¡habilidades de pintura enferma!).
Las reglas de Tic Tac Toe en un toro son las mismas que las de Tic Tac Toe normal. Cada jugador coloca alternando Xs y Os. El primero con 3 símbolos iguales en una fila, una columna o una diagonal gana.
Dado que un toro es bastante difícil de visualizar, simplemente proyectamos el tablero nuevamente en un papel. Ahora podemos jugar el juego como Tic Tac Toe normal. La única diferencia es que también puedes ganar con 3 símbolos iguales en una diagonal rota. Por ejemplo, el Jugador 1 (X) gana el siguiente tablero. Puede ver esto fácilmente cambiando un poco la vista del toro.
Si estás interesado, puedes jugar a Tic Tac Toe en un Torus en Torus Games . Hay una versión para Windows, Mac y Android.
Juegos óptimos
En este desafío estaban interesados en juegos óptimos. Un juego óptimo es un juego, donde ambos jugadores juegan una estrategia óptima. En un tablero regular de Tic Tac Toe, los juegos óptimos siempre terminan en empate. Fascinantemente en un tablero de toro siempre gana el primer jugador. De hecho, un juego en un tablero de toro nunca puede terminar en un empate (también si los jugadores juegan de manera no óptima).
La estrategia óptima es realmente fácil:
- Si puedes ganar colocando tu símbolo, hazlo.
- De lo contrario, si su oponente tiene dos símbolos en una fila / columna / giagonal, intente bloquearlo. De lo contrario, haz lo que quieras.
- De lo contrario, haz lo que quieras.
Cada juego óptimo consta de exactamente 7 movimientos y estos movimientos se pueden describir de la siguiente manera:
- El jugador 1 coloca una X en cualquier lugar del tablero (9 opciones)
- El jugador 2 coloca una O en cualquier lugar del tablero (8 opciones)
- El jugador 1 coloca una X en cualquier lugar del tablero (7 opciones)
- El movimiento del jugador 2 puede ser forzado (1 opción), si no, coloca el O en cualquier lugar (6 opciones)
- El movimiento del jugador 1 es forzado (1 opción)
- El jugador 2 está atrapado en una bifurcación (el jugador 1 puede ganar de dos maneras diferentes), por lo que el jugador 2 tiene que bloquear al jugador 1 de una manera (2 opciones)
- El jugador 1 coloca su último movimiento y gana (1 opción)
Hay 9 * 8 * 1 * 6 * 1 * 2 * 1 + 9 * 8 * 6 * 1 * 1 * 2 * 1 = 1728 juegos óptimos diferentes en nuestro tablero proyectado. Aquí puedes ver un juego óptimo típico:
Si etiquetamos cada celda del tablero con los dígitos 0-8
, podemos describir este juego por los dígitos 3518207
. Primero, una X se coloca en la celda 3 (fila central, columna izquierda), que una O en la celda 5 (fila central, columna derecha), que una X en la celda 1 (fila superior, columna central), ...
Usando esta notación de dígitos generamos automáticamente un pedido. Ahora podemos ordenar todos los juegos óptimos de 1728 y obtenemos la lista:
Game 0000: 0123845
Game 0001: 0123854
Game 0002: 0124735
Game 0003: 0124753
Game 0004: 0125634
...
Game 0674: 3518207
...
Game 1000: 5167423
Game 1001: 5167432
Game 1002: 5168304
...
Game 1726: 8765034
Game 1727: 8765043
Reto
Esta lista es parte de tu trabajo. Recibirá un número k
entre 0 y 1727 y deberá devolver el k
juego en notación de dígitos de esa lista ordenada.
Escribe una función o un programa, que recibe el número k
(entero) calcula el juego correspondiente. Puede leer la entrada a través de STDIN, argumento de línea de comando, argumento de solicitud o función e imprimir el resultado (7 dígitos) en un formato legible (p. Ej. 0123845
O [0, 1, 2, 3, 8, 4, 5]
) o devolverlo usando una cadena (formato legible por humanos) o un entero (que contiene todos dígitos en base 10), o en cualquier formato de matriz / lista.
El tipo de desafío es el código de golf. Por lo tanto, el código más corto gana.
fuente
Respuestas:
JavaScript (ES6), 266308
317 334 341Una función que devuelve una cadena. Editar Se encontró una solución aritmética para la función M (¡por fin!)
Muy ingenuo
, se puede acortar de muchas maneras. Simplemente enumera todos los valores legales posibles y devuelve lo que encuentra en el lugar n. La función M devuelve la posición entre dos celdas, que es el movimiento obligatorio para bloquear a un jugador opuesto.Más legible
fuente
Octava,
467369363309297caracteres297:
El único cambio relevante es que nunca verificamos si el jugador actual puede ganar, solo verificamos la posibilidad del oponente de ganar el próximo turno . Como el único turno que puede ganar el jugador 1 es el turno 7 , este es el único lugar donde el algoritmo produciría un juego que no es óptimo, pero es muy fácil filtrar esa situación. Simplemente verificamos cada juego generado si lo ganó el jugador 1; si no lo fue, el movimiento en el turno 7 fue incorrecto, por lo que no agregamos este juego a la mesa de juegos óptima.
(Exactamente la mitad de los juegos generados por esta regla son falsos, es decir. en el séptimo turno, el jugador 1 siempre tiene dos posibilidades para bloquear al jugador dos, pero solo uno lo hará ganar instantáneamente).
Utilizar:
El código sin golf parece:
fuente