Escriba un programa que procese una representación artística ASCII de una cadena enredada y decida si se puede desenredar o no en un bucle simple. El enredo se representa usando los caracteres -
y |
para representar segmentos horizontales y verticales, y +
para representar esquinas. Los lugares donde la cadena pasa sobre sí misma se representan de la siguiente manera:
| |
------- ---|---
| |
(Horizontal segment on top) (Vertical segment on top)
Los extremos de la cuerda están conectados entre sí; No hay cabos sueltos.
Si su programa decide que la cadena no se puede desenredar en un bucle simple, debería generar la palabra KNOT
. De lo contrario, debería generar la palabra NOT
.
Este es un desafío de código de golf , por lo que la respuesta válida más corta (medida en bytes del código fuente) ganará.
Límites
La entrada ASCII constará de hasta 25 líneas de 80 caracteres. Puede suponer que todas las líneas están rellenadas con espacios de la misma longitud.
Ejemplos
Entrada:
+-------+ +-------+
| | | |
| +---|----+ +-------+
| | | | | |
+-------|------------|---+
| | | |
+---+ +---+
Salida:
KNOT
Entrada:
+----------+
| |
| +--------------+
| | | |
| | +-|----+ |
| | | | | |
| +-----+ | |
| | | |
| +------|---+
| |
+---------------+
Salida:
NOT
Referencias
fuente
Respuestas:
Python 3,
457316306 bytes¿Eh?
El programa primero convierte el nudo en un diagrama rectangular, que tiene las siguientes restricciones:
Por ejemplo, el primer caso de prueba se convierte al siguiente diagrama rectangular:
que representamos únicamente por la secuencia de coordenadas y de los segmentos verticales, de derecha a izquierda:
Luego busca simplificaciones del diagrama rectangular como se describe en Ivan Dynnikov, “Presentaciones en arco de enlaces. Simplificación monotónica ”, 2004 . Dynnikov demostró que, desde cualquier diagrama rectangular del nudo, hay una secuencia de movimientos simplificadores que termina en el diagrama trivial. Brevemente, los movimientos permitidos incluyen:
Vea el periódico para fotos. Este no es un teorema obvio; no se mantiene si, por ejemplo, se utilizan movimientos Reidemeister que no aumentan el número de cruces. Pero para los tipos particulares de simplificaciones anteriores, resulta ser cierto.
(Simplificamos la implementación solo permutando segmentos verticales, pero también permitiendo que todo el nudo se transponga para intercambiar horizontalmente con vertical).
Manifestación
fuente