Antecedentes
Pase a "Tarea" si está familiarizado con Tic-Tac-Toe (¡creo que la mayoría lo está!)
Tic-Tac-Toe es un famoso juego de dos jugadores. Consiste en un tablero de 3x3 que se llena gradualmente por dos jugadores (aclaraciones a continuación); El primer jugador usa el personaje X
y el otro usa O
. El ganador es el primero en obtener 3 caracteres ( X
o O
) consecutivos e idénticos , ya sea horizontal, vertical o diagonal. En caso de que el tablero esté lleno y ninguno de los jugadores haya logrado obtener tres personajes consecutivos como se describe anteriormente, el juego termina en un empate. Tenga en cuenta que puede haber espacios vacíos al final del juego, en caso de que alguno de los jugadores gane en menos de 9 movimientos en total (esto no puede suceder en caso de empate).
Tarea
Dado un tablero de Tic-Tac-Toe al final de un juego (en forma de una cadena, una matriz, una lista plana de 9 valores ordenados, cualquier otro formato decente), determine quién gana el juego.
La entrada consistirá en valores distintos y consistentes , uno para
X
, uno paraO
y otro que representa un espacio vacío.Su programa debería poder generar 3 valores distintos, consistentes y no vacíos: uno en caso de que
X
gane, otro en caso de queO
gane u otro si los jugadores están empatados.Por favor, especifique estos valores en su respuesta. Puede suponer que la entrada será un tablero Tic-Tac-Toe válido.
Casos de prueba
X
, O
, _
Son los valores de entrada aquí; X wins
, O wins
y Tie
son para la salida.
X O X
O X _
O _ X
Salida: X wins
.
X _ O
X O _
X O X
Salida: X wins
.
X O X
_ O X
_ O _
Salida: O wins
.
X O X
O O X
X X O
Salida: Tie
.
Como de costumbre, se aplican todas nuestras reglas estándar. Este es el código de golf , ¡gana el código más corto en bytes en cada idioma!
fuente
Respuestas:
Jalea ,
16 1514 bytesUn enlace monádico que acepta una lista de listas (las filas o columnas) con los valores:
Resultados devueltos:
Nota: usando un valor de cero para
_
, y valores iguales pero opuestos paraX
yO
, este valor (aquí0.155
) puede estar en el rango(1/6, 1/7)
(exclusivo en ambos extremos): solo elegí un valor en ese rango que dio un resultado de punto flotante representable con precisión para los casos ganadores.Pruébalo en línea!
¿Cómo?
fuente
Javascript (ES6),
10387 bytesEntrada
1
2
0
Salida
"111"
"000"
"T"
Explicación
Casos de prueba
fuente
Jalea , 18 bytes
Pruébalo en línea!
X
=1
,O
=-1
,_
=0
X gana =
[1, 1, 1]
, O gana =[-1, -1, -1]
, Empate =0
Ingrese como una lista de 3 listas de 3 elementos en
(1, -1, 0)
cada una.fuente
X
=1
,O
=2
,_
=3
, devuelve1
(X gana),2
(O gana) o3
(empate).Python 3 , 73 bytes
Pruébalo en línea!
Python 2 ,
1009592878277 bytesPruébalo en línea!
Toma la entrada como una cadena separada de nueva línea de
XO_
Salidas:
{'XXX'}
paraX
,{'OOO'}
paraO
{}
por un empateFunciona cortando la cadena en filas, columnas y diagonales:
luego
'XXX'
y'OOO'
se verifican contra las rodajas.Toma la entrada como una cadena separada de nueva línea de
XO_
Salidas:
{'XXX'}
paraX
,{'OOO'}
paraO
{}
por un empateFunciona cortando la cadena en filas, columnas y diagonales:
luego
'XXX'
y'OOO'
se verifican contra las rodajas.fuente
[2::2]
corta3579
, mientras[2:8:2]
da357
R,
118116115 bytesGracias a @ user2390246 por dos bytes adicionales.
Ligeramente no golfista:
Devuelve
X
si X gana,O
si O gana yT
en caso de empate.Pruébalo en línea!
fuente
M[c(3,5,7)]
es más corto para la diagonal opuestaPerl 5 , 58 bytes
Código de 56 bytes + 2 fpr
-p0
.Pruébalo en línea!
Salidas
X
yO
para victorias, oT
para un empate. Incluye un montón de código de encabezado / pie de página para probar todo a la vez.Alternativa, 58 bytes
Pruébalo en línea!
fuente
Python 2 ,
124118117115 bytes[j*3:j*3+3]
a[j*3:][:3]
.Pruébalo en línea!
Valores de entrada / salida
X
se representa como1
O
se representa como2
_
se representa comoNone
fuente
[8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6]
->map(int,'8036147258048246')
map(ord,"...")
, aunque unnul
byte en medio de una cadena no funcionó ...[j*3:j*3+3]
es[j*3:][:3]
. Como nota al margen,j*3+3
es lo mismo que-~j*3
, pero eso es 118 bytes también.01234567
...Python 3 , 173 bytes
Pruébalo en línea!
Entrada como una matriz de
1 == X, 0 == O, -1 == _
Salida como un solo valor:
2 == X, 1 == O, 0 == TIE
-8 bytes gracias a Erik the Outgolfer
fuente
lambda x:h(x,1)*2or+h(x,0)
-8 bytes y0 == TIE
(que es más bonita).PHP, 70 bytes
Asume
-n
(valores predeterminados del intérprete). Además requiere-R
(ejecutar<code>
para cada línea de entrada), contado como uno.La entrada se toma en una sola línea (exactamente como en la descripción del problema, excepto con todos los espacios en blanco eliminados).
La salida es la siguiente:
1
→ X gana,-1
→ O gana,0
→ Tie.Pruébalo en línea!
fuente
'X Wins'
se puede cambiar a'X'
(o incluso un número entero, por ejemplo1
). Lo mismo se aplica a'O wins'
yTie
. Dicho esto, 109 bytes .Retina , 49 bytes
Pruébalo en línea! Toma la entrada como una cadena de 11 caracteres de 9
X
s,O
so-
s en tres grupos de tres separados por;
s, aunque el enlace incluye un encabezado que traduce los casos de prueba dados a este formato. Funciona haciendo coincidir una línea ganadora directamente con un grupo de equilibrio para garantizar que los tres personajes coincidentes sean equidistantes. (Las distancias adecuadas son 0 (línea horizontal), 4 (diagonal inversa), 5 (línea vertical) o 6 (diagonal); otras distancias golpearían;
o se extenderían fuera de la cuerda).fuente
Java 8,
1121081061049010293 bytes+12 bytes (90 → 102) debido a la corrección de errores de solo verificar una diagonal en lugar de ambas ...
-9 bytes (102 → 93) usando
replaceAll
lugar dematches
.De entrada en el formato
XOX OX_ O_X
, la producciónX
,O
oT
.Explicación:
Pruébalo aquí.
Explicación regex:
fuente
Retina , 127 bytes
Pruébalo en línea!
... supongo que podrías llamar a esta fuerza bruta ... Pensé que podría haber algún mérito ...
fuente
Retina , 51 bytes
Puerto de mi respuesta Java 8 . De entrada en el formato
XOX OX_ O_X
, la producciónX
,O
oT
.Explicación:
Pruébalo aquí.
fuente
J, 34 bytes
Sin golf:
Explicación
Codificación:
Nuestra estrategia de alto nivel es primero crear una matriz cada una de cuyas filas sea una posible victoria. La fila uno es diagonal /, la fila 2 es diagonal \, las tres filas siguientes son las filas y las tres filas finales son las columnas. Esta parte se logra mediante la frase (usando el ítem Modificar
}
):Finalmente tomamos el MCD de cada fila:
Gracias a nuestra codificación, cualquier fila con un espacio en blanco tendrá un MCD de 1, al igual que cualquier fila que contenga cualquier combinación de X y Os, porque 2 y 3 son primos. Entonces, todo lo que tenemos que hacer a continuación es encontrar el elemento máximo:
>./
Si el juego es un empate, será 1. Si un jugador gana, será el número de ese jugador.
Pruébalo en línea!
fuente
JavaScript, 66 bytes
Manteniéndolo simple.
0
corresponde a un espacio en blanco,1
una X y2
una O.0
para un empate,1
para X victoria,2
para O victoria.Ampliado, ligeramente comentado:
fuente