Le poisson bien-aimé qui nage à travers le code de > <> (un langage de programmation ésotérique) a été retiré de son environnement naturel. Ce changement l'a rendu incapable de se déplacer comme d'habitude: ce qui était autrefois un mouvement toroïdal a été limité à un simple mouvement de gauche à droite. Mais> <> les programmes sont toujours écrits comme si le poisson était capable de se déplacer à travers eux. C'est votre tâche, cher programmeur, d'écrire un programme pour linéariser un programme> <>. Et faites-le en aussi peu d'octets que possible; les poissons n'ont pas de très grands souvenirs.
Mouvement dans> <>
Dans> <>, le mouvement est toroïdal et un caractère à la fois. Cela signifie que le poisson (le pointeur) peut «s'enrouler» de la fin d'une ligne jusqu'au début. Dans> <>, le poisson est également capable de se déplacer de haut en bas, de bas en haut et de droite à gauche, contrairement à la façon dont la plupart des pointeurs se déplacent. Donc, ce modèle de mouvement serait valide:
>>>^ >>>v
>>>^ v
et il se terminerait sur une boucle infinie (rebouclant sur la ligne supérieure une fois qu'il franchit infiniment le bas).
Le poisson se déplace dans une grille de longueur égale à max (longueur de ligne) et de hauteur égale au nombre de lignes.
Comment déterminez-vous dans quelle direction le poisson se déplace? Ces commandes modifient le vecteur de direction du mouvement (par exemple (-1,0)
, de droite à gauche):
Command | Direction Change
---------------------------
> | (1,0) (default)
< | (-1,0)
^ | (0,1)
v | (0,-1)
/ | (x,y) -> (y,x)
\ | (x,y) -> (-y,-x)
| | (x,y) -> (-x,y)
_ | (x,y) -> (x,-y)
# | (x,y) -> (-x,-y)
; | (0,0)
Comme indiqué, le poisson commence à se déplacer de gauche à droite, c'est-à-dire avec un vecteur de direction (1,0)
. Le poisson commence à analyser les commandes en commençant par la première commande qu'il voit et change de direction si une commande correspond à l'un des changeurs de direction susmentionnés.
Le poisson cesse de bouger lorsqu'il voit un ;
et termine le programme.
Contribution
L'entrée sera un programme valide (par exemple pas en boucle infinie) donné via STDIN. Vous pouvez également lire un fichier si vous le souhaitez. Les lignes de chaque programme ne seront pas nécessairement de la même longueur.
L'entrée est donnée sous forme de chaîne, avec des sauts de ligne séparant chaque ligne du programme.
Les programmes ne boucleront pas, ce qui signifie également qu'ils se termineront toujours par a ;
.
Production
La sortie sera le programme linéarisé. Autrement dit, vous devez retourner tous les caractères (y compris les changeurs de direction) que le poisson verrait s'il exécutait le programme "normalement". C'est tous les personnages sur son chemin vers le ;
.
Si l'entrée contient des lignes de longueur inégale et que le poisson finit par se déplacer le long d'une ligne plus courte que la longueur de la ligne la plus longue, vous devez traiter cela comme si le poisson se déplaçait sur un espace (voir les cas de test).
Ceux qui sont familiers avec> <> sauront que les changeurs de direction ne sont pas le seul moyen d'y faire du mouvement, mais pour des raisons de simplicité, traitez l'entrée comme s'ils étaient le seul moyen d'affecter le mouvement.
Règles
- Des échappatoires standard s'appliquent
- Vous pouvez écrire soit un programme complet soit une fonction
- L'entrée est fournie via STDIN ou un fichier sous la forme d'une chaîne contenant les lignes de programme séparées par des sauts de ligne (
\n
)- Vous pouvez prendre la saisie différemment, dans des limites raisonnables (n'hésitez pas à me demander si vous avez une sorte spécifique de contribution à l'esprit). Vous ne pouvez pas remplir l'entrée avec des espaces afin que les longueurs de ligne correspondent.
- Reportez-vous à cette méta-publication concernant la saisie flexible. Dans l'état actuel de l'affichage, le consensus général doit être aussi flexible que possible dans les limites du raisonnable.
- La sortie est une chaîne unique via STDOUT ou renvoyée par la fonction (selon ce que vous choisissez de faire, voir la règle 2)
Cas de test
v >v
>abcv//;
gfed<^ih
v>abcv<defghi^//>v;
v >v
>abcv//;
gfed<^
v>abcv<defg ^//>v;
abcdef;
abcdef;
abcd|;
abcd|dcba;
abcd#;
abcd#dcba;
abcd\;
_
abcd\_\dcba;
^;
>abcde/
^jihg<
^ >abcde/ <ghij^a;
;
;