Escriba un programa o función que tome una cadena multilínea de 0
'sy 1
' s. No habrá otros caracteres en la cadena y la cadena siempre será rectangular (todas las líneas tendrán el mismo número de caracteres), con dimensiones tan pequeñas como 1 × 1, pero de lo contrario las 0
'sy 1
' pueden estar dispuestas arbitrariamente.
Puede suponer que la cadena tiene una nueva línea final opcional, y si lo desea, puede usar dos caracteres ASCII imprimibles distintos en lugar de 0
y 1
.
Imprima o devuelva un valor verdadero si todas las regiones conectadas a la ruta de ambos 0
's y 1
' s en la cadena son rectángulos sólidos , de lo contrario genera un valor falso .
Una región de ruta conectada0
significa que desde cualquiera 0
de la región, 0
se puede llegar a todas las demás moviéndose solo hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha hacia las de otras personas 0
(y sin moverse en diagonal, sin moverse hacia ninguna 1
, y no se mueve fuera de los límites de la cadena). La misma idea se aplica a las 1
regiones conectadas por ruta.
Un rectángulo sólido de 0
's significa que toda el área del rectángulo está llena de 0
' sy no 1
'. La misma idea se aplica a 1
los rectángulos sólidos.
El código más corto en bytes gana. Tiebreaker es la respuesta anterior.
(Tenga en cuenta que la cadena no se ajusta a las condiciones de contorno toroidales ).
Ejemplos
1) Esta cadena de entrada tiene 3 regiones conectadas a la ruta (2 para 0
y 1 para 1
). Sin 00
embargo, solo la región inferior derecha es un rectángulo sólido, por lo que la salida sería falsa.
0011
0111
0100
2) Esta cadena de entrada tiene 4 regiones conectadas a la ruta (2 para ambos 0
y 1
). Todos ellos son rectángulos sólidos, por lo que el resultado sería verdadero.
0011
0011
1100
3) Esta entrada tiene 2 regiones conectadas a la ruta, pero solo una de ellas es un rectángulo sólido, por lo que la salida sería falsa.
00000000
01111110
00000000
4) Esta entrada tiene solo 1 región conectada a la ruta y es trivialmente un rectángulo sólido, por lo que la salida es verdadera.
11111111
11111111
11111111
Casos de prueba
Un T
poco debajo de la cadena de entrada significa verdadero, F
significa falso.
0
T
1
T
00
T
01
T
10
T
11
T
0000000
T
1111111
T
011100100100101100110100100100101010100011100101
T
00
11
T
01
10
T
01
11
F
00
01
F
11
11
T
110
100
F
111
000
T
111
101
111
F
101
010
101
T
1101
0010
1101
0010
T
1101
0010
1111
0010
F
0011
0111
0100
F
0011
0011
1100
T
00000000
01111110
00000000
F
11111111
11111111
11111111
T
0000001111
0000001111
T
0000001111
0000011111
F
0000001111
1000001111
F
1000001111
1000001111
T
1110100110101010110100010111011101000101111
1010100100101010100100010101010101100101000
1110100110010010110101010111010101010101011
1010100100101010010101010110010101001101001
1010110110101010110111110101011101000101111
F
Ruby, 76
En cualquier cuadrícula compuesta completamente de rectángulos, cada línea debe ser idéntica a la línea anterior, o tener todos los bits invertidos de 0 a 1 y viceversa.
Esto es fácil de probar. Tome un trozo de papel y dibuje líneas arbitrarias verticales y horizontales a través de él. Ahora colorea los rectángulos usando solo 2 colores. Terminará con un tablero de ajedrez distorsionado, donde todos los colores cambian en cada línea.
¿Desea dibujar rectángulos con líneas solo en parte? intente eliminar un segmento de cualquiera de sus líneas. Ahora necesitará más de 2 colores para colorear su diseño, porque tendrá puntos donde se encuentran 3 rectángulos (2 esquinas y un borde). Por lo tanto, tales diseños son irrelevantes para esta pregunta.
Estoy sorprendido de que las respuestas hasta ahora no hayan notado esto.
Creo que este algoritmo debería ser mucho más corto en algún otro idioma.
Sin golf en el programa de prueba
fuente
s.scan(/^?.*\n/)
ayudaría a ahorrar bytes.Caracoles , 20 bytes
Imprime el área de la cuadrícula si no hay un cuadrado de 2x2 con 3 ceros y uno o 3 unos y un cero, o
0
si existe un cuadrado de 2x2.fuente
MATL , 12 bytes
Mismo algoritmo que la gran respuesta de @ sp3000 .
Para permitir la entrada multilínea, MATL necesita que la matriz de caracteres de fila (cadena) se construya explícitamente usando el carácter
10
de nueva línea. Entonces, la entrada de los cuatro ejemplos es (tenga en cuenta que[]
es una concatenación, por lo que cada uno de estos es una matriz de filas de caracteres):y los últimos tres casos de prueba son
La salida de verdad es una matriz que contiene solo unos.
Pruébalo en línea!
Explicación
Esto utiliza el hecho de que la paridad de caracteres
'0'
y'1'
es la misma que la de los números0
y1
, por lo tanto, no es necesario convertir de char al dígito que representa,fuente
['first line' 10 'second llne']
, donde10
está ASCII para la nueva línea. ¿Es eso aceptable?'0011 0111 0100'
JavaScript (ES6), 69 bytes
Creo que el criterio del rectángulo de conectividad de ruta es equivalente a exigir que, dados los cuatro puntos que forman las esquinas de un rectángulo arbitrario, haya un número par de
1
s. Tenga en cuenta que la paridad del rectángulo (0, b), (x, y) es la misma que (0, b), (a, y)^
(a, b), (x, y), así que solo tengo que verificar esos rectángulos cuya esquina superior izquierda está en (0, 0). También según las leyes de De Morgan,!.some()
es lo mismo.every(!)
que me ahorra un par de bytes.Editar: me doy cuenta de que la solución Jelly verifica la paridad de las esquinas de todos los rectángulos 2 × 2, que pueden ser equivalentes.
fuente
JavaScript (ES6), 79
Mismo algoritmo de respuesta de Jelly de @ Sp3000 (y feliz de no tener que demostrar que funciona). Solo 8 veces más
Menos golf
Banco de pruebas
fuente
Grime v0.1, 31 bytes
Imprime
1
por partido y0
sin partido.Pruébalo en línea!Explicación
Grime es mi lenguaje de coincidencia de patrones 2D. Lo modifiqué hoy, pero solo para cambiar el carácter de un elemento de sintaxis (en
`
lugar de,
), para que no afecte mi puntaje.Estoy usando un enfoque similar al de Sp3000 : una entrada es falsa si contiene un rectángulo de 2 × N cuya fila contiene ambos
0
y1
, y la otra fila no.fuente
JavaScript (ES6), 64 bytes
Basado en la observación de @ LevelRiverSt de que cada línea debe ser la misma o la opuesta a la primera.
fuente