Ecrivez un programme qui traite une représentation artistique ASCII d'une chaîne enchevêtrée et décide si elle peut ou non être démêlée en une simple boucle. L'enchevêtrement est représenté à l'aide des caractères -
et |
représente les segments horizontaux et verticaux, ainsi que les +
angles. Les endroits où la chaîne passe sur lui-même sont représentés comme suit:
| |
------- ---|---
| |
(Horizontal segment on top) (Vertical segment on top)
Les extrémités de la chaîne sont connectées ensemble; il n'y a pas de bouts.
Si votre programme décide que la chaîne ne peut pas être démêlée en une simple boucle, il doit générer le mot KNOT
. Sinon, il devrait sortir le mot NOT
.
Ceci est un défi code-golf , donc la réponse la plus courte valide (mesurée en octets de code source) sera gagnante.
Limites
L'entrée ASCII comprendra jusqu'à 25 lignes de 80 caractères. Vous pouvez supposer que toutes les lignes sont complétées par des espaces de même longueur.
Exemples
Contribution:
+-------+ +-------+
| | | |
| +---|----+ +-------+
| | | | | |
+-------|------------|---+
| | | |
+---+ +---+
Sortie:
KNOT
Contribution:
+----------+
| |
| +--------------+
| | | |
| | +-|----+ |
| | | | | |
| +-----+ | |
| | | |
| +------|---+
| |
+---------------+
Sortie:
NOT
Références
la source
Réponses:
Python 3,
457316306 octetsHein?
Le programme convertit d'abord le nœud en diagramme rectangulaire, qui présente les restrictions suivantes:
Par exemple, le premier cas de test est converti en diagramme rectangulaire suivant:
que nous représentons uniquement par la suite des coordonnées y des segments verticaux, de droite à gauche:
Il cherche ensuite des simplifications du diagramme rectangulaire décrites dans Ivan Dynnikov, «Présentations de liens en arc. Simplification monotone ”, 2004 . Dynnikov a prouvé que, quel que soit le diagramme rectangulaire du dénouement, il existe une séquence de mouvements simplifiants qui se terminent au diagramme trivial. En bref, les mouvements autorisés incluent:
Voir le papier pour les images. Ce n'est pas un théorème évident; cela ne tient pas si, par exemple, Reidemeister utilise des mouvements qui n'augmentent pas le nombre de passages à niveau. Mais pour les types particuliers de simplifications ci-dessus, cela s'avère être vrai.
(Nous simplifions la mise en œuvre en ne permutant que les segments verticaux, mais en permettant également de transposer tout le nœud pour un échange horizontal avec vertical.)
Démo
la source