Le but de ce défi est de trouver la direction et la zone délimitée par une boucle.
Contribution:
Une grille rectangulaire composée entièrement de ces caractères: ^v<>
(Facultativement, vous pouvez également recevoir les dimensions de la grille avant la grille elle-même en décimal avec un caractère préfixe, suffixe et séparateur de votre choix.)
Une boucle dans la grille est un ensemble des caractères susmentionnés tels que l'un pointe vers le suivant, pointant vers le suivant, pointant éventuellement vers le premier caractère. Par exemple:
<>>v> >>v
^^<>v ^ >v
>^<<< ^<<<
>^<v>
La grille de gauche est l'échantillon d'entrée; la grille de droite est la boucle isolée.
La grille d'entrée ne contiendra aucune boucle ou une seule boucle; vous n'avez pas à vous soucier des cas dans lesquels la grille contient plus d'une boucle.
Sortie:
Si la grille ne contient pas de boucle, sortez X
.
Si la grille contient deux flèches pointant l'une vers l'autre, sortez 0
.
Si la grille contient une boucle dans le sens antihoraire, comptez les caractères entourés par la boucle, y compris la bordure. Sortez ce nombre.
Si la grille contient une boucle dans le sens horaire, suivez le même processus pour la boucle dans le sens antihoraire, mais sortez le négatif de ce nombre. Par exemple, la grille d'entrée ci-dessus aurait une sortie de -11
: 10 provenant de la boucle elle-même et 1 du caractère entouré par la boucle.
C'est du code-golf . Le code le plus court gagne.
Cas de test:
<<^
^>v
^v<
Sortie X
.
<<<<
><<<
>>^>
Sortie 0
.
<>^^<
>>>v>
<^^>v
<^>>v
>^<<<
Sortie -15
.
v<<<<
>v>>^
v<^<<
>>>>^
Sortie 20
.
Réponses:
C #, 604 octets
Programme complet, accepte les entrées (disposition délimitée par des lignes, pas de dimensions) de STDIN, les sorties vers STDOUT.
Le programme fonctionne en lisant d'abord la mise en page, inutile de le dire, puis en itérant sur chaque cellule. Nous exécutons ensuite un «serpent» à partir de chaque cellule, qui suit les flèches jusqu'à ce qu'il coule sur le bord ou se jette dans lui-même. Si elle se heurte à elle-même, alors nous savons que nous avons trouvé une boucle (ou l'une de ces "> <" choses), et elle sait également combien de serpent est dans la boucle.
Une fois que nous savons que nous avons une boucle, nous savons quelles cellules sont sur la boucle, et nous créons une carte de chaque cellule (+1, pour des raisons) à elle-même,
-1
(signifie qu'elle est sur la boucle), ouW
(toute la largeur) s'il est sur le bord (ou le +1 (qui est à l'indexW
) pour simplifier encore les choses).Pendant que nous faisons cela, nous trouvons également la direction du «dernier» élément de la boucle (c'est-à-dire le dernier élément de la boucle sur la dernière ligne qui contient des éléments de la boucle). Cet élément doit être un "<" ou un "^", ce qui nous indique la fréquence d'horloge (CW / CCW) de la boucle (traduite en -1 / + 1).
Nous effectuons ensuite une passe d'ensemble disjoint, qui affecte tous les éléments qui sont en dehors de la boucle à l'
W
ensemble. Nous soustrayons ensuite leur nombreW
pour obtenir le nombre contenu sur et dans la boucle. Si ce nombre est inférieur à 3, nous le remplaçons par 0. Nous le multiplions par la fréquence d'horloge, le définissons comme résultat, et échappons en quelque sorte aux boucles for, où le résultat est sorti.Si, cependant, la plupart des éléments ci-dessus ne se produisent jamais (car aucun serpent ne se retrouve jamais), le résultat reste alors "X", et cela est émis.
la source