Escriba un programa que muestre todas las posiciones posibles de Tic Tac Toe, incluido el resultado del juego correspondiente. Evite la salida duplicada de posiciones iguales.
El programa no toma ninguna entrada.
Reglas:
- Una salida de posición debe constar de 9 caracteres, utilizando
X
yO
para los cuadrados tomados, y un carácter arbitrario que no sea un espacio en blanco para los cuadrados en blanco - Cada posición debe imprimirse en 3 líneas / columnas, con una línea en blanco como separador entre dos posiciones.
- Se admiten espacios en blanco adicionales / líneas en blanco / caracteres de dibujo de recuadro
- El jugador X va primero
El resultado puede ser cualquiera de:
- X ha ganado
- O ha ganado
- Dibujar
- Juego en progreso
Usted es libre de elegir una visualización adecuada del resultado de la posición, por ejemplo, como texto en color o como anotación textual, siempre que se coloque cerca de la posición correspondiente
- Las posiciones se consideran iguales si una se puede obtener de la otra por rotación o reflejo. No se deben imprimir posiciones duplicadas. (En otras palabras, imprima solo las clases de igualdad).
Por ejemplo, imprima solo uno de los siguientes:
X•• ••X ••• •••
••• ••• ••• •••
••• ••• X•• ••X
- Este es el código de golf , ¡el código más corto gana!
Salida de muestra:
•••
•••
••• -
X••
•••
••• -
•X•
•••
••• -
•••
•X•
••• -
[…]
XXO
OOX
XXO /
OXO
XXX
OXO X
Sugerencia: Hay 765 posiciones, con 91 victorias para X, 44 victorias para O y 3 empates.
Se ha hecho una pregunta similar antes, pero esta es diferente.
code-golf
tic-tac-toe
ThomasR
fuente
fuente
Respuestas:
Gelatina ,
192179168 bytesPruébalo en línea! (Toma alrededor de 30 segundos, así que sea paciente).
Cómo funciona
Resumen de alto nivel:
En pasos intermedios, esto almacena X como
1
, sin colocar como0
, y O como-1
. El programa genera todas las posibilidades de 3 ^ 9, luego mantiene solo las posiciones válidas en función del cumplimiento de los tres criterios:Luego, el programa reemplaza cada estado del juego con todas sus rotaciones y reflexiones para obtener una lista de todas las clases de equivalencia. Esta es la operación que lleva la mayor parte del tiempo.
El primer estado del juego se toma de cada una de las clases de equivalencia, luego se calcula quién ganó.
Dónde sucede esto Las líneas están numeradas para facilitar la lectura.
fuente
Rubí, 305 bytes.
Esto funciona de manera similar a las otras respuestas, ya que genera todos los
3**9
paneles y luego filtra los válidos. Internamente, usamos números ternarios0=X 1=. 2=O
en la salida. Repitec
los 3 valores posibles para el centro ys
los3**8 = 6561
valores para el perímetro. Antes de convertiri/3
a una representación de cadena de un número ternario, multiplicamos por6562
para duplicar todos los dígitos, y sumamos3**16
para comenzar el número con un 1, para asegurar que haya ceros a la izquierda cuando corresponda.w
es la condición ganadora: establezca esto en cero.Para cada tablero, itere a través de 4 rotaciones de los dígitos
s
para encontrar la versión léxicamente más baja del número ternario actual de 8 dígitos que representa el perímetro. Al mismo tiempo, agregue los valores ascii de los primeros 3 dígitos (fila superior de la rotación actual) y use esto para verificar una ganancia. Además, agregue los valores ascii dec
y un par de dígitos diametralmente opuestos para verificar si hay una victoria en el centro.Compruebe si la salida es válida : si tanto el bit 1 como el bit 64
w
están configurados, ambos lados ganan, esto no es válido. Verifique el saldo de X y O (si todavía no hay un ganador, puede ser X y O igual o una X más, pero si el juego se gana, solo hay un valor posible, ya que el ganador debe haber sido el último). Para evitar mostrar diferentes rotaciones de la misma placa, solo emita si la versión léxicamente más baja del perímetro corresponde al valor actual des[2,9]
.Salida del tablero , sustituyendo los símbolos
tr("012","X.O")
. El estado del juego se muestra debajo del tablero. Si w = 0, esto estrue
si todavía hay cuadrados vacíos (el juego aún está en progreso) yfalse
si el tablero está lleno. Siw
no es cero, sacamos1
si el jugador 1 (X) ha ganado o64%31==2
si el jugador 2 (O) ha ganado.Sin golf
Esquema de comprobación
Los diagramas a continuación muestran el esquema de rotación (y verificación de victorias, en mayúsculas). Los diagramas se muestran sin rotar. Las cuatro rotaciones diferentes se toman como subcadenas de la copia doble de
i/3
, con las 3 letras mayúsculas consecutivas en el perímetro de cada diagrama (la "parte superior" por rotación actual) son los primeros 3 caracteres en la subcadena de 9 caracteres. Para cada rotación, también se intenta la inversión de 9 caracteres (giro diagonal sobre el eje AE o CG). La placa solo sale si el valor actual dei/3
es el léxico más bajo de todas las rotaciones y espejos.fuente
Python 2 ,
648620 bytesPruébalo en línea!
Probablemente un poco de golf menor posible aquí con este enfoque; pero no mucho.
Editar: Thx a ovs, que notó un ajuste que gana 28 bytes; y 3 de Artemis Fowl
Código sin golf
La idea básica aquí es: fuerza bruta cada una de las 3 ^ 9 = 19683 posibles codificaciones de placa. Mantenga un registro de los conjugados (rotaciones y reflexiones) de tableros que ya han sido examinados para no duplicar entradas. Como mínimo, los tableros válidos deben tener un número igual de X y O o una X más que O. No es posible tener tanto una victoria para X como una victoria para O; más algunas restricciones meticulosas adicionales.
fuente
Counter
. Puede reemplazarlo conc=b.count;d=c(x)-c(o)
return
puede serreturn 0if d not in[0,1]else 0if w and v else(x*(d==1))if w else(o*(d==0))if v else'.'if'.'in b else'/'