¡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 wina loseo 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 xs seguidos (diagonal, horizontal, vertical). una pérdida es de 3 os seguidos, mientras que un catjuego 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, xxoxoxooxes 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 0x1a9que hexadecimal 110101001podría funcionar como una compresión adecuada donde 1se puede manipular para xsy 0se 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
Winantes,losepor 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 el0x1a9ejemplo en la pregunta, ¡aunque0xes 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
273dos veces. ¡Y realmente me gusta lamaxidea!Mathematica, 84 caracteres
Formato de entrada:
{{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}fuente
Tr@aes la traza del campo (suma sobre diagonal),Tr@Reverse@aes la traza del campo invertido (algo sobre antia diagonal),Tr/@aseTraplica a cada fila, lo que le da la suma sobre cada fila,Total@ale da la suma sobre cada columna. Básicamente, tienes las 8 líneas que debes verificar. Luego, laWhichcosa se aplica a eso (básicamente unaif/elseif/elsedeclaración), donde#representa esa lista de 8 valores.ifhay un3que ganas,else ifhay un0que 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 XNota: 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
xen la secuencia con un 1 y cadaocon 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
7o0.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
xyo, 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
NameErrorexcepción en todos los casos exceptocat.fuente
<<<! +1 solo por eso../whatever <<< 'blah blah blah'es lo mismoecho -n 'blah blah blah' | ./whateverpero sin tener un proceso completamente separado paraecho.echoenbashrealidad 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,
scontiene 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
detectWinfunció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.
110101001para el tablero de ejemplo dado en la pregunta.Ruby, 78 caracteres
Formato de entrada:
xxo_xox_ooxfuente
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):
arepresenta el cuadrado central, 1 para una X, 0 para una Obes 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*4096es distinto de cero)tres cuadrados perimetrales adyacentes son X (
b/8 & b & b*8no 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áscaramtambié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
men 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 decym; Las constantes se convierten en hexadecimal para guardar un personaje cada una.printfno necesita una cadena de formato, solo proporcione la cadena de resultado como formato, oputsbien, 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-xoosalidaslose(use a-para separar las filas). Entrada en stdin. Requiere GNU sed para elccomando.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
$bcomo/cwinpara 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 convertirxaoycwinaclose(generando así las condiciones de perder). Luego envía las dos cosas yccat(que se generarácatsi 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 luegocTEXTimprime 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
winsalida. Oque da como resultado una
catsalida, 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 necesariorcontado).fuente
Golpe: 208 caracteres
Ejecutar
bash tictactoe.sh 0 1 0 1 0 1 1 0 1Inspirado 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 esxy el enemigo eso. Los cuadrados vacíos pueden ser cualquier cosa exceptoxoo.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:
1para X,0para O, de izquierda a derecha, de arriba a abajo. En este caso,101001110representaLo que lleva a la salida:
Catfuente
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
ies una cadena simple con delimitadores para las filas, es decir100|001|100Editar: 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
gameque 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