CJam, 33 32 20 19 17 bytes
Versión revisada, con soporte masivo de @ Sp3000 y @ MartinBüttner:
qN/_z]{:e`z,3<}/|
Pruébalo en línea
Contribuciones
- @ Sp3000 sugirió una simplificación crítica de mi algoritmo original.
- @ MartinBüttner aplicó sus locas habilidades de golf al enfoque revisado, que casi con certeza resultó en un código más corto de lo que hubiera llegado incluso después de considerar la simplificación.
Algoritmo y Prueba
A continuación se explican los criterios para que el rompecabezas se deslice horizontalmente. El caso vertical puede determinarse mirando columnas en lugar de filas, o transponiendo la matriz de caracteres y mirando las filas nuevamente.
Usaré el término "estirar" para una secuencia máxima de las mismas letras. Por ejemplo, las siguientes filas tienen 1, 2 y 3 tramos respectivamente:
AAAAAAAA
BBBAAAAA
AABBBAAA
También usaré el término "enclavado" para una fila / rompecabezas que no puede separarse.
La observación clave es que el rompecabezas puede separarse si y solo si todas las filas tienen como máximo 2 tramos . O invertido, se enclava si y solo si hay alguna fila con más de 2 tramos .
Lo siguiente podría no calificar como una prueba matemática estricta, pero creo que es una explicación convincente de por qué este tiene que ser el caso.
Es fácil ver que el rompecabezas está enclavado si tiene filas de más de 2 tramos. Mirando una fila con 3 tramos:
BBBAAB
Está claro que evita que el rompecabezas se separe porque el A
tramo está bloqueado entre los B
tramos. Esto significa que la fila está enclavada, lo que a su vez hace que todo el rompecabezas esté enclavado.
La dirección opuesta de la prueba no es tan obvia. Necesitamos demostrar que no hay acertijos entrelazados donde todas las filas tengan solo 1 o 2 tramos. Comenzando con un par de observaciones:
- Las filas con solo 1 tramo no contribuyen a que un rompecabezas se entrelace, ya que pueden deslizarse en cualquier dirección sin colisiones.
- Si todas las filas con 2 tramos tienen el mismo orden de
A
y B
, el rompecabezas claramente no está enclavado. En este caso, todas las A
celdas quedan de todas las B
celdas, o viceversa, y no hay colisiones al separar las dos piezas.
El único caso complicado serían los rompecabezas donde tenemos filas con 2 tramos de diferente orden. Voy a mostrar que tales rompecabezas no existen bajo las especificaciones dadas. Para mostrar esto, veamos un rompecabezas parcial que tiene esta configuración, donde .
están los comodines:
.......
AAABBBB
.......
BBAAAAA
.......
Ahora, la especificación dice que tanto el A
y B
las células se conectan simplemente en todos los puzzles válidos. Para hacer que las A
celdas se conecten en el rompecabezas parcial anterior, tenemos dos opciones:
Damos vueltas alrededor de uno de los tramos de B
, por ejemplo:
..AAAAAA
AAABBBBA
.......A
BBAAAAAA
........
Para hacer esto, inevitablemente extendemos una de las filas para tener 3 tramos, por lo que esto nunca nos dará un rompecabezas válido donde todas las filas tengan como máximo 2 tramos.
Los conectamos por un camino directo:
.......
AAABBBB
..A....
BBAAAAA
.......
Las A
celdas ahora están simplemente conectadas y todavía no hay filas con más de 2 tramos. Sin embargo, las B
células también necesitan estar simplemente conectadas. La ruta directa ahora está bloqueada por las A
celdas conectadas , y la única forma de conectar las B
celdas es hacer un bucle alrededor de uno de los tramos de las A
celdas. Esto nos lleva de vuelta al caso 1, donde no podemos hacer eso sin crear filas de 3 tramos.
Para contar los tramos, la implementación utiliza el operador CJam RLE.
Explicación del Código
qN/ Get input and split at newlines.
_z Make a transposed copy.
] Wrap the original and transposed puzzle in an array so that we can
loop over the two.
{ Start of loop over original and transposed puzzle.
:e` Apply RLE to all rows.
z, Transpose the matrix with the RLE rows, and take the element count of the
result. Or in other words, take the column count. This will be the length
of the longest row after RLE.
3< Check the length for less than 3.
}/ End of loop over original and transposed puzzle.
| Or the results of the two.