Takuzu es un juego de lógica en el que debes completar una cuadrícula con celdas que contienen 0
sy 1
s. La cuadrícula debe seguir 3 reglas:
- No hay tres celdas consecutivas horizontales o verticales que puedan ser iguales.
- Debe haber un número igual de
0
s y1
s en cada fila y columna. - No hay dos filas iguales, y no hay dos columnas iguales.
Veamos una cuadrícula terminada:
0011
1100
0101
1010
Como puede ver, este tablero sigue la regla 1
, 2
y 3
. No hay tres celdas horizontales o verticales que sean iguales, todas las filas y columnas contienen un número igual de 0
sy 1
s, y no hay dos filas ni dos columnas iguales.
Veamos una cuadrícula que no es válida:
110100
010011
011010
101100
100011
001101
Hay muchos problemas con esta cuadrícula. Por ejemplo, la fila 5
tiene tres 0
s seguidas y la columna 2
tiene tres 1
s seguidas, seguidas de tres 0
s. Por lo tanto, esta no es una cuadrícula válida.
Tarea:
Su tarea es hacer un programa que, dada una matriz 2D de n
* n
0
s y 1
s, verifica el tablero para ver si es una tabla válida, acabada Takuzu.
Ejemplos:
0011
1100
0101
1010
Este tablero sigue todas las reglas y, por lo tanto, es un tablero válido de Takuzu. Debe devolver un valor verdadero para esto.
11
00
Este no es un tablero válido: la fila 1
no sigue la regla 2
. Debe devolver un valor falso para esto.
100110
101001
010101
100110
011010
011001
Este no es un tablero válido, falla (solo) debido a la regla 3: la primera y la cuarta fila son las mismas.
110100
001011
010011
101100
100110
011001
Este no es un tablero válido, falla (solo) debido a la regla 3: la primera y la cuarta columna son iguales.
011010
010101
101100
010011
100110
101001
Este es un tablero válido.
Reglas y especificaciones:
- Puede suponer que todos los tableros son cuadrados de dimensiones
n * n
, donden
es un número entero positivo. - Puede suponer que todas las tablas están terminadas.
- Puede tomar la entrada como una matriz 2D que contiene valores que significan
0
y1
, o como una cadena. - Debe generar valores consistentes de verdad y falsey para las tablas de verdad y falsey, y los valores que representan "verdad" y "falsey" no pueden ser los mismos.
Este es el código de golf , por lo que gana el código más corto en bytes.
fuente
Respuestas:
Brachylog ,
2018 bytesPruébalo en línea!
Explicación
fuente
false
para esto ?Casco ,
1918 bytesPruébalo en línea!
1 byte guardado gracias a H.PWiz!
La idea principal es aplicar una serie de transformaciones a la entrada que son identidades para una placa válida y verificar si el resultado final es el mismo que la entrada original.
Explicación
fuente
)
Jalea , 17 bytes
Pruébalo en línea!
-6 bytes gracias a millas y Jonathan Allan .
fuente
µZ$⁺
nuevo: p ... y 17 bytes intercambiando un poco: D ahoraMathematica, 143 bytes
entrada
fuente
Python 2 , 127 bytes
Pruébalo en línea!
Lee una lista de n n -tuplas como entrada.
Podría generar el código de salida escribiendo en
1/(…)
lugar de hacerlo,print…
pero se siente escoria. ¿Debería?Explicación
n
es el tamaño del tablero;b
es una lista de columnas (transposición dea
). El resto es una comparación largamente encadenada:[n/2]*n*2==map(sum,a+b)
verifica la regla 2. Cada fila y columna debe sumar n / 2.map(sum,a+b)>len(set(a))
siempre es cierto (list> int).len(set(a))==len(set(b))==n
verifica la regla 3.n<'0, 0, 0'
siempre es cierto (int <str).'0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`
comprueba la regla 1.`a+b`
es la representación de cadena de todas las filas y columnas; para la entrada de ejemplo en TIO esEl
`a+b`>'1, 1, 1'
en el centro siempre es cierto ya que esta cadena está garantizada para comenzar"["
, que es mayor que"1"
.fuente
[n/2]*n*2==map(sum,a+b)>len(set(a))==len(set(b))==n<'0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`>x
, que es 2 bytes más corto que la división y da como resultadoNameError
entradas verdaderas.Casco ,
2725 bytesLa entrada es una lista de listas y la salida es
1
paraTrue
y0
paraFalse
Pruébalo en línea!
Explicación
Prueba 1
Prueba 2
Prueba 3
fuente
Retina ,
1298985 bytesPruébalo en línea! Salidas 0 para válido, 1 para inválido. Editar: Guardado 4 bytes gracias a @MartinEnder. Explicación:
Duplicar cada fila con
,
separadores.Transponer el primer duplicado.
Duplicar nuevamente, esta vez con
;
separadores.Elimine todos los pares de dígitos coincidentes que preceden a un punto y coma.
Verifique si alguna columna o fila falla alguna de las reglas;
(.)\1\1
busca tres dígitos idénticos seguidos,\d,?;
busca un dígito no apareado y(\D\d+\b).*\2
busca un duplicado.fuente
(...).*
última etapa es hacerlomax(matches,1)
, puede guardar tres bytes utilizando1
en su lugar una configuración..\b\d+\b
puede ser\D\d+\b
..*
que había estado usando anteriormente pero que no pensé usar una configuración para limitar el resultado, gracias!Pyth , 31 bytes
Muchas gracias a @Leaky Nun .
Verifique todos los casos de prueba o ¡ Pruébelo aquí!
Pyth ,
48 46 4442 bytesEsta es la solución inicial.
Verifique todos los casos de prueba o ¡ Pruébelo aquí!
fuente
MATL , 27 bytes
La entrada es una matriz que contiene
0
y1
. La salida es0
por falsedad,1
por verdad.Pruébalo en línea! O vea los casos de prueba: 1 , 2 , 3 , 4 , 5 .
Explicación
fuente
R ,
114107bytes-7 gracias a Giuseppe, llamando a las funciones fuera de servicio y realmente comprimiendo las condiciones
Pruébalo en línea!
Esto solo aplica las reglas a las columnas de la matriz, luego las columnas de la transposición de la matriz.
Toma entrada en el formulario:
Así es como R toma las matrices 2D.
Salidas VERDADERO para fallas, FALSO para pases.
fuente
mean(y)-.5
dentro de la internaf
función para obtener los medios en lugar decolMeans
, e hicierong
el anonimato. Se añade advertencias para convertirdouble
alogical
en la llamada aany
pero eso está bien.Perl 6 ,
10093 bytesCruces FTW! Ahorran 7 bytes.
Por el momento, esto parece estar superando a todas las otras presentaciones escritas en idiomas que no son de golf. Yippie!
Pruébalo en línea!
Explicación : Es un bloque que toma el tablero como una lista de listas. Hacemos una transposición con
[Z] @^a
(reducir la lista de listas con el operador zip). Entonces,@^a,[Z] @^a
hay una lista del tablero y su transposición. Lo recorrimos con lofor
que funciona exactamente igualmap
, solo siendo 1 char más barato en este caso.En el interior, primero unimos las listas que constituyen filas en cadenas, por lo que tenemos una lista de cadenas en lugar de una lista de listas (
@(.map(*.join))
). Luego usamos un bloque anónimo en él (.&{...}
), donde realmente evaluamos las reglas. Los evaluaremos solo en fila. (Ya que lo hacemos para la matriz original y la transposición también).Para ahorrar bastante
!
, usamos un poco de lógica y en lugar de probar(NO repeated rows) AND (NO 3 consecutive same symbols) AND (NOT different counts of 0 and 1)
, probamosNOT[ (repeated rows) OR (3 consecutive same symbols) OR (different counts) ]
. Eso es lo que hacemos en el bloque anónimo:.repeated
da todas las filas que ocurren más de una vez, luego mapeamos sobre las filas, tratamos de hacer coincidir 3 símbolos consecutivos usando una expresión regular y restamos los recuentos de 0 y 1. Estos son OR'red con el|
. (En realidad, crea una cosa muy poderosa llamada unión , pero no usamos ninguno de sus poderes :)) Después de todo esto, obtenemos una lista de 2 "bools" (uniones sin colapsar). Finalmente o ellos (usandomax
) y negate (!
), lo que da el resultado deseado.fuente
J,
403855 bytesPruébalo en línea!
Define una función que toma una matriz cuadrada como entrada.
Al menos está venciendo a Pyth (por ahora ...)(erróneamente). Debería volver a contar los emoji ocultos en mi código, ya que J también se presta bien a eso:[:
/^:
:1
|:
:]
:-.@
:#
:@]
:~@
Explicación (ligeramente desactualizada)
Esto se ve diferente de mi respuesta, y puedo llegar a actualizarlo. Algunas partes siguen siendo las mismas: simplemente no estaba buscando la regla 3 y no estaba verificando la regla 2 antes.
Dividido en algunas funciones y sin golf:
unirse_trans
Esto une la transposición de la matriz a sí misma, creando una matriz de matrices.
parte_3
Esto verifica la suma de particiones de 3 filas para ver si es 3 o 0 (ya que cualquiera de estos significa una placa inválida), devolviendo 1 si es así y 0 en caso contrario. Funciona tanto en la matriz como en su transposición, ya que le da ambas.
F
Por falta de un mejor nombre, lo llamo
f
. Reemplaza los 0 con _1 y deja los 1 sin cambios. Esto es para permitirme verificar eventualmente si el número de 0s y 1s es igual en cada fila y columna (la suma de cada una de las filas debería ser 0).principal
Básicamente, lo que aprovechan el hecho de que yo he instalado de manera que
f join_trans
ypart_3 join_trans
ambos deben sumar a 0 si y sólo si la junta es válido.part_3
debe ser todos ceros para un tablero válido y la totalidad def
debe sumar cero para un tablero válido, lo que significa que la suma de sus sumas es 0 solo para un tablero válido.fuente
*/@,@,&(~:,(0~:3|3+/\]),#=2*+/)|:
Haskell ,
137136127 bytes¡9 bytes guardados gracias a Lynn!
Pruébalo en línea!
fuente
all
s en unoand
:l x=x==nub x&&and[sum y*2==length x&¬(j[0,0,0]y||j[1,1,1]y)|y<-x]
j=isSubSequenceOf
aj x=isSubSequenceOf[x,x,x]
?j a b
invocarlo (y definirlo) comoa#b
?Java 8,
350326325312303299298259255 bytesDevuelve
0
cuando es un tablero válido;1
si no es válido para una o más de las tres reglas.-95 bytes gracias a @Nevay .
Explicación:
Pruébalo aquí
fuente
Python 3, 187 bytes
Pruébalo en línea!
Toma la entrada como una lista de líneas.
fuente
05AB1E , 29 bytes
Pruébalo en línea!
Explicación
Regla 3
Regla 2
Regla 1
Luego tomamos el producto del resultado de las 3 reglas con
P
fuente
Dyalog APL,
6452514948 bytesRequiere
⎕IO←0
Pruébalo en línea!
fuente
PHP, 245 + 1 bytes
ew esto es voluminoso. los saltos de línea son solo para conveniencia de lectura:
Toma una sola cadena sin líneas nuevas, imprime
1
para la verdad, nada para la falsedad.Ejecutar como tubería
-nR
o probarlo en línea .fuente