¡Juguemos un código de golf!
Dado un estado de tablero de tres en raya (Ejemplo :)
|x|x|o|
|x|o|x|
|o|o|x|
Determina si un juego es un win
a lose
o cat
. Su código debe mostrar cualquiera de estas opciones dado un estado. El juego anterior debería salirlose
Para ser claros: una ganancia se define como 3 x
s seguidos (diagonal, horizontal, vertical). una pérdida es de 3 o
s seguidos, mientras que un cat
juego en ninguno en una fila.
Para hacer las cosas interesantes, puede determinar su estructura de entrada para el estado, que luego debe explicar. Por ejemplo, xxoxoxoox
es un estado válido como se ve arriba, donde cada uno de los caracteres se lee de izquierda a derecha, de arriba a abajo. [['x','x','o'],['x','o','x'],['o','o','x']]
es el juego en matriz multidimensional leído de manera similar. Mientras 0x1a9
que hexadecimal 110101001
podría funcionar como una compresión adecuada donde 1
se puede manipular para x
sy 0
se puede manipular para o
.
Pero esas son solo algunas ideas, estoy seguro de que podría tener muchas propias.
Reglas de juego:
- Su programa debe poder aceptar cualquier estado viable.
- La forma de entrada debe poder representar cualquier estado.
- "El estado ganador debe determinarse desde el tablero"
- Asumir una tabla completa
Win
antes,lose
por ejemplo, en el caso 'xxxoooxxx'
El conteo de personajes más bajo gana
(win|lose|cat) [xo]{9}
donde la primera palabra denota si el juego es ganar, perder o gato (?) Para el jugador x. Capaz de representar cualquier estado.Respuestas:
Ruby 2.0, 85 caracteres
Aquí hay una solución simple basada en máscara de bits en Ruby:
El tablero se representa como un número hexadecimal, compuesto por nueve bits correspondientes a los nueve cuadrados. 1 es un
X
, 0 es unO
. Esto es como el0x1a9
ejemplo en la pregunta, ¡aunque0x
es opcional!Probablemente haya una mejor manera de hacer las máscaras de bits que simplemente codificar una gran lista. Felizmente tomaré sugerencias.
Véalo corriendo en Ideone aquí .
fuente
273
dos veces. ¡Y realmente me gusta lamax
idea!Mathematica, 84 caracteres
Formato de entrada:
{{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}
fuente
Tr@a
es la traza del campo (suma sobre diagonal),Tr@Reverse@a
es la traza del campo invertido (algo sobre antia diagonal),Tr/@a
seTr
aplica a cada fila, lo que le da la suma sobre cada fila,Total@a
le da la suma sobre cada columna. Básicamente, tienes las 8 líneas que debes verificar. Luego, laWhich
cosa se aplica a eso (básicamente unaif/elseif/else
declaración), donde#
representa esa lista de 8 valores.if
hay un3
que ganas,else if
hay un0
que pierdes,else if 1>0
(cierto)cat
.Golpe:
283262258Con una interfaz relativamente amigable.
Ejecutar
bash tictactoe.sh O X O X O X X O X
Nota: la lista de 9 posiciones es una representación matricial estándar. No importa si el tablero está representado como columna mayor o fila mayor, lea de izquierda a derecha o de arriba a abajo; los juegos de ceros y cruces (o tic tac toe si insiste) son simétricos, por lo que el orden de entrada debe ser irrelevante al resultado en cada implementación correcta, siempre que la entrada sea lineal.
Editar: Gracias a hjk por sugerencias de sintaxis de funciones más cortas.
fuente
t() { ... }
lugar defunction t
? Puede guardar algunos personajes allí. :)<<<
para guardar otros cuatro caracteres.Befunge 93-375
Toma una cadena binaria como entrada.
Lee la cadena. Bruteforce lo escribe (la tira más vertical derecha) como una matriz entre
agregando celosía (idk). Determina la suma de las columnas, filas y dos diagnósticos. Compara esos valores con 3 ("ganar") o 0 ("perder"), de lo contrario, si todos los valores son iguales a 1 o 2, entonces empate ("gato").
fuente
GolfScript, 27 caracteres
El formato de entrada es una cadena que consta de ocho dígitos octales, cada uno de los cuales (de forma redundante) codifica tres cuadrados de placa consecutivos:
Para codificar una secuencia (fila / columna / diagonal) de tres cuadrados como un dígito octal, reemplace cada
x
en la secuencia con un 1 y cadao
con un 0, e interprete la secuencia resultante de unos y ceros como un número binario entre 0 y 7 inclusivo.Este formato de entrada es bastante redundante (todas las posiciones de la junta se codifican al menos dos veces, con la posición central codificado cuatro veces), pero no de forma inequívoca representa ningún posible estado de una tabla de tic-tac-dedo del pie está completamente lleno, y no directamente codificar el ganador en la entrada.
La entrada puede, opcionalmente, contener espacios u otros delimitadores entre dígitos. De hecho, todo lo que realmente le importa al programa es si la cadena de entrada contiene o no los dígitos
7
o0
.Por ejemplo, el tablero de ejemplo:
puede estar representado por la entrada:
Para mayor comodidad, aquí hay un programa GolfScript para convertir un diseño de tablero de arte ASCII, como se muestra en el desafío anterior, en una cadena de entrada adecuada para este programa:
Este convertidor ignora cualquier carácter que no sea
x
yo
, en cualquier caso, en su entrada. Produce una cadena de un solo dígito (completa con delimitadores de espacio como se muestra arriba) adecuada para alimentar el programa de determinación de victorias anterior, por lo que la concatenación de estos dos programas se puede utilizar para determinar el ganador directamente del tablero de arte ASCII.Además, aquí hay un convertidor inverso, solo para demostrar que la entrada de hecho representa inequívocamente la placa:
PD. Aquí hay una demostración en línea de esta solución.
fuente
Python 2 - 214 bytes
Estoy seguro de que hay mejoras por hacer.
Correr:
que representa este tablero:
Salidas con una
NameError
excepción en todos los casos exceptocat
.fuente
<<<
! +1 solo por eso../whatever <<< 'blah blah blah'
es lo mismoecho -n 'blah blah blah' | ./whatever
pero sin tener un proceso completamente separado paraecho
.echo
enbash
realidad es un proceso integrado, por lo que no bifurca un nuevo procesoHaskell, 146 caracteres
OKAY :). Mi representación de un tablero es uno de esos 126 caracteres.
Aquí está la solución en 146 caracteres:
Y así es como funciona, como un script haskell:
fuente
JavaScript, 420 caracteres
En esta versión,
s
contiene un número entero que representa el estado del tablero de juego. Es una matriz de valores de bits donde dos bits representan cada cuadrado en el tablero:10
- X11
- O00
- Plaza vacíaEsta solución utiliza la manipulación de bits para probar cada una de las ocho configuraciones posibles de "tres en una fila" (las prueba cada una dos veces, una para X y otra para O).
Presento esto con una minificación menor de mi sitio web Tic-Tac-Toe donde esta
detectWin
función está en uso como parte de un juego real de Tic-Tac-Toe.fuente
Ruby, 84 caracteres
Solución simple basada en RegExp. El formato de entrada es una cadena binaria de 9 dígitos, p. Ej.
110101001
para el tablero de ejemplo dado en la pregunta.Ruby, 78 caracteres
Formato de entrada:
xxo_xox_oox
fuente
Haskell, 169
Formato de entrada: "X" solo está representado por
x
"O" solo poro
. Dentro de cada fila, los caracteres son simultáneos sin espacios, etc. Las filas están separadas por nuevas líneas.Genera todas las filas / columnas / diagonales posibles, luego filtra
[("ooo","lose"),("xxx","win")]
por su existencia en el tablero, luego selecciona la segunda palabra en la tupla, para que sepamos qué jugadores ganaron. Anteponemos"cat"
para que podamos tomar el último elemento de la lista como nuestro ganador. Si ambos jugadores ganaron,"win"
será el último (las comprensiones de la lista mantienen el orden). Como"cat"
siempre es el primero, si existe un ganador, se elegirá, pero de lo contrario todavía existe un último elemento como antecedente"cat"
garantía no garantiza la nada.EDITAR: Afeitó 3 caracteres cambiando la última comprensión de la lista a
map
.fuente
C, 150 aprox.
Aquí es medianoche y no he hecho ninguna prueba. , pero de todos modos publicaré el concepto. Volveré a eso mañana.
El usuario ingresa dos números octales (quería usar binarios, pero que yo sepa, C solo admite octal):
a
representa el cuadrado central, 1 para una X, 0 para una Ob
es un número de nueve dígitos que representa los cuadrados del perímetro, dando vueltas alrededor del tablero comenzando en una esquina y terminando en la misma esquina (solo con la repetición de esa esquina), 1 para una X, 0 para una O.Hay dos formas posibles de ganar:
el cuadrado central es X (
a
= 1) y dos cuadrados opuestos también son X (b&b*4096
es distinto de cero)tres cuadrados perimetrales adyacentes son X (
b/8 & b & b*8
no es cero). Esto es solo una victoria válida si el cuadrado del medio es un cuadrado de borde, no un cuadrado de esquina, por lo tanto, es necesario aplicar la máscaram
también, para evitar los casos de cuadrado de esquina.La pérdida se detecta utilizando la variable c, que es la inversa de b.
fuente
m
en la detección de "pérdida"c/8&c&c*8
. He rediseñado su código (sin probar su funcionamiento) de la siguiente manera:int a,b;t(v){return a&&v&v<<12||v/8&v&v*8&0x208208;}main(){scanf("%o%o",a,b);printf("%s",t(b)?"win":t(b^0x1249249)?"lose":"cat");}
(130 caracteres). La prueba repetida fue lo suficientemente larga como para extraerla en una función de pruebat()
; esto elimina la necesidad dec
ym
; Las constantes se convierten en hexadecimal para guardar un personaje cada una.printf
no necesita una cadena de formato, solo proporcione la cadena de resultado como formato, oputs
bien, ya que la pregunta no solicita una nueva línea después de la salida! (ahorra otros 7 caracteres).Golpetazo,
107103Genera y ejecuta un script sed.
Formato de E / S:
oxo-oox-xoo
salidaslose
(use a-
para separar las filas). Entrada en stdin. Requiere GNU sed para elc
comando.He interpretado la regla 5 como "si tanto ganar como perder son posibles, elija ganar".
Código principal
Esta es la respuesta real.
Nada interesante realmente. En él se definen
$b
como/cwin
para salvar a los personajes, a continuación, define la parte condición de victoria de la secuencia de comandos, a continuación, utilizased y/x/o/\;s$b/close/
para convertirx
ao
ycwin
aclose
(generando así las condiciones de perder). Luego envía las dos cosas yccat
(que se generarácat
si no se cumple ninguna condición de ganar / perder) para sed.Código generado
Este es el script sed generado y ejecutado por el script Bash.
En las expresiones regulares,
.
coincide con cualquier carácter y luegocTEXT
imprime TEXTO y sale si la expresión regular coincide.Esto puede ejecutarse como un script sed independiente. Tiene 125 caracteres, puede contarlo como otra solución.
fuente
Pitón 3, 45
La entrada está en
i
, que es una lista de números que representan cada fila, columna y diagonal del tablero de juego, por ejemplo:está representado por
[6, 2, 1, 4, 6, 1, 7, 4]
.Código :
('cat','lose','win')[2 if 7 in i else 0 in i]
fuente
Dart - 119
(Ver dartlang.org ).
Versión original con RegExp: 151 caracteres.
La entrada en la línea de comando tiene 11 caracteres, por ejemplo, "xxx | ooo | xxx". Cualquier carácter que no sea xo puede usarse como delimitador.
Deben omitirse los espacios en blanco y las nuevas líneas antes de contar los caracteres, pero elimino el espacio en blanco interno cuando sea posible. Desearía que hubiera una forma más pequeña de hacer la subcadena.
Versión de base de bits recusiva: 119 caracteres. La entrada debe ser un número de 9 bits con 1 que represente 'x' y 0 que represente 'o'.
fuente
CJam,
39 3836 caracteresEste es un código convertido base para
que tiene 52 caracteres de largo.
La entrada es simplemente la representación de cadena del tablero que comienza desde la parte superior izquierda, yendo fila por fila. Por ejemplo:
que da como resultado una
win
salida. Oque da como resultado una
cat
salida, etc.El código simplemente hace las siguientes tres cosas:
q3/_
- Divida la cadena en partes de 3, es decir, por fila_z
- Copie la matriz por fila y transponga en matriz por columna.__Wf%s4%
- Invierta cada fila y obtenga la diagonal de izquierda a derecha. Esta es la diagonal secundaria del tablero.\s4%
- Obtener la diagonal principal del tablero]`
- Envuelva todo en la matriz y stringifique la matriz.Ahora tenemos todos los grupos posibles de 3 del tablero. Simplemente verificamos la existencia de "ooo" y "xxx" para determinar el resultado.
Pruébalo en línea aquí
fuente
GNU sed, 25 bytes
Si la entrada es una representación redundante del tablero con vistas separadas para columnas, filas y diagonales, como también se usa en otras respuestas, entonces sed es muy adecuado para verificar el estado final del juego con la menor cantidad de bytes.
Formato de entrada:
xxx ooo xxx xox xox xox xox xox
(estado del tablero tomado de la pregunta del OP)Si el formato de entrada no es redundante (
xxx ooo xxx
), el código sed anterior solo funciona si está precedido por la línea de abajo, lo que hace que el programa tenga 96 bytes de longitud (con el marcador necesarior
contado).fuente
Golpe: 208 caracteres
Ejecutar
bash tictactoe.sh 0 1 0 1 0 1 1 0 1
Inspirado por esta respuesta .
fuente
VB.net
Con el ejemplo, provide se codifica como el siguiente patrón de bits
Ahora podemos determinar el resultado (o ganador) haciendo lo siguiente.
fuente
J - 97 bytes
Bueno, el enfoque más simple disponible. La entrada se toma como
111222333
, donde los números representan filas. Leer de izquierda a derecha. El jugador esx
y el enemigo eso
. Los cuadrados vacíos pueden ser cualquier cosa exceptox
oo
.Ejemplos: (NB. Es un comentario)
Código sin golf una explicación
fuente
Python 2, 120 bytes
O Python, 115 bytes desde el shell de Python (2 o 3):
La variable de placa se establece en el formato binario descrito en la pregunta:
1
para X,0
para O, de izquierda a derecha, de arriba a abajo. En este caso,101001110
representaLo que lleva a la salida:
Cat
fuente
Python (
7362 caracteres)La entrada es cuatro cadenas en minúsculas que representan cuatro vistas distintas de la misma placa, todas concatenadas en una sola cadena: por fila, por columna, diagonal derecha, diagonal izquierda.
ACTUALIZAR
¡Gracias a theRare por señalar esto con un buen contraejemplo! Cada vista del tablero, junto con cada segmento (fila o columna) dentro de un tablero, debe estar separada por un carácter que no sea ni una "x" ni una "o" para que la estructura del tablero se conserve incluso después de la concatenación. Los bordes alrededor de cada vista del tablero serán corchetes ("[" y "]"), y el separador entre filas / columnas será un carácter de tubería "|".
Esto hace que el algoritmo sea simple: solo busque "xxx" u "ooo" para ver si gana o pierde, respectivamente. De lo contrario, es un empate (gato).
Por ejemplo, el tablero (lectura de izquierda a derecha, de arriba a abajo) ...
X | X | X X | O | X O | X | O
... se representa como "[xxx | xox | oxo]" (por filas) + "[xxo | xox | xxo]" (por columnas) + "[xoo]" (diagonal derecha) + [xoo] "(izquierda diag) = "[xxx | xox | oxo] [xxo | xox | xxo] [xoo] [xoo]".
Esta declaración de Python imprime el resultado del juego dada la variable s como entrada:
fuente
OXX XOO XOX
(debería ser gato)?Haskell (69 caracteres)
Esto toma la misma entrada como se describe en esta respuesta . Más específicamente, la entrada es de 8 valores octales, que describen el valor binario de cada fila, columna y diagonal. El código hace que cada instancia de 7 "gane", cada instancia de 0 "pierda" y elimina todo lo demás. Luego agrega "gato" al final y toma los primeros 4 caracteres del resultado.
Habrá 4 respuestas posibles: "perder", "gato", "ganar" seguido de una 'l', y "ganar" seguido de una 'c', que las reglas no prohíben :)
Ejemplo de uso:
fuente
J: 83
Uso: simplemente agregue una cadena de X y O y observe cómo funciona la magia. p.ej. 'xxxoooxxx'.
El verbo interno
(+/@:(*./"1)@;@(;((<0 1)&|:&.>@(;|.)(,<)|:)))
básicamente encajona la matriz binaria original, con la transposición encuadrada junto con las 2 diagonales. Estos resultados se arrasan juntos; se toman sumas de fila para determinar las ganancias y luego se suman. Además llamaré a este verboInner
.Para encontrar el ganador, el gancho toma la diferencia de los puntajes entre las matrices binarias normales e inversas
(-&Inner -.)
.El resto del código simplemente genera las salidas y selecciona la correcta.
fuente
JavaScript,
133, 114 caracteresLa entrada
i
es una cadena simple con delimitadores para las filas, es decir100|001|100
Editar: actualicé mi método para reemplazar los 1s en la expresión regular con ceros para verificar el caso de pérdida.
fuente
=
y las comillas alrededor del literal regex. Además,1...
es un personaje más corto que1.{3}
.r.test(i)
También es un personaje más corto quei.match(r)
.J - 56 (26?) Char
La entrada recibe una matriz 3x3 de nueve caracteres, porque J puede admitir eso como un tipo de datos, LOL.
Ejemplos:
Si se nos permite la codificación Golfscriptish de dígitos octales que representan de forma redundante el estado de cada fila, columna y diagonal, entonces son solo 26 caracteres:
fuente
T-SQL (2012), 110
select max(iif(@&m=0,'lose',iif(@&m=m,'win','cat')))from(VALUES(292),(146),(73),(448),(56),(7),(273),(84))z(m)
La entrada es un número hexadecimal. Esto es más o menos una traducción de la solución ruby a T-SQL bastante agradable y ordenada.
fuente
Javascript 1.6, 71 caracteres
Asumo la entrada como una matriz
game
que contiene cada fila, cada columna y cada diag como una cadena de 3 caracteres. Similar a la respuesta de bob , pero viene en una matriz, no como una cadena concatenada.EDITAR @ nyuszika7h 's comentario (67 caracteres)
fuente
~game.indexOf("xxx")
lugar degame.indexOf("xxx")>=0
, lo mismo para el otro.Java 7, 260 bytes
Sin golf y casos de prueba:
Pruébalo aquí
Salida:
fuente
APL (NARS), 69 caracteres, 138 bytes
La entrada debe ser una matriz de 3x3 o una matriz lineal de 9 elementos que puede ser solo 1 (para X) y 0 (para O), el resultado será "cat" si nadie gana, "perder" si O gana, "ganar "si X gana. No hay verificación para una placa o entrada inválida si una matriz tiene menos de 9 elementos o más o verifica cada elemento <2.
Como comentario: convertiría la entrada en una matriz de 3x3 y construiría una matriz llamada "x" donde los elementos son la suma de cada columna de fila y diagonal.
Algunos ejemplos de prueba se muestran de otros:
fuente