Escreva um programa que processe uma representação artística ASCII de uma sequência emaranhada e decida se ela pode ou não ser emaranhada em um loop simples. O emaranhado é representado usando os caracteres -
e |
para representar segmentos horizontais e verticais e +
para representar cantos. Os locais onde a sequência passa sobre si são representados da seguinte maneira:
| |
------- ---|---
| |
(Horizontal segment on top) (Vertical segment on top)
As extremidades da cadeia são conectadas juntas; Não há pontas soltas.
Se o seu programa decidir que a sequência não pode ser desemaranhada em um loop simples, ela deve gerar a palavra KNOT
. Caso contrário, ele deve gerar a palavra NOT
.
Este é um desafio de código-golfe , portanto a resposta mais curta e válida (medida em bytes do código-fonte) vencerá.
Limites
A entrada ASCII consistirá em até 25 linhas de 80 caracteres. Você pode assumir que todas as linhas são preenchidas com espaços do mesmo comprimento.
Exemplos
Entrada:
+-------+ +-------+
| | | |
| +---|----+ +-------+
| | | | | |
+-------|------------|---+
| | | |
+---+ +---+
Resultado:
KNOT
Entrada:
+----------+
| |
| +--------------+
| | | |
| | +-|----+ |
| | | | | |
| +-----+ | |
| | | |
| +------|---+
| |
+---------------+
Resultado:
NOT
Referências
fonte
Respostas:
Python 3,
457316306 bytesHã?
O programa primeiro converte o nó em um diagrama retangular, com as seguintes restrições:
Por exemplo, o primeiro caso de teste é convertido no seguinte diagrama retangular:
que representamos exclusivamente pela sequência de coordenadas y dos segmentos verticais, da direita para a esquerda:
Em seguida, procura simplificações do diagrama retangular, como descrito em Ivan Dynnikov, “Apresentações em arco de links. Simplificação monotônica ”, 2004 . Dynnikov provou que, a partir de qualquer diagrama retangular do nó, existe uma sequência de movimentos simplificadores que termina no diagrama trivial. Resumidamente, os movimentos permitidos incluem:
Veja o jornal para fotos. Este não é um teorema óbvio; não é válido se, digamos, movimentos de Reidemeister que não aumentam o número de cruzamentos forem usados. Mas para os tipos específicos de simplificações acima, isso é verdade.
(Simplificamos a implementação permitindo apenas segmentos verticais, mas também permitindo que todo o nó seja transposto para trocar horizontal com vertical.)
Demo
fonte