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;
;
;
Réponses:
Röda ,
405393392391371366361236234232230223200 octetsEssayez-le en ligne!
Vérifiez les sorties!
Explication (obsolète)
Modifications
%
au lieu de vérifier si x ou y dépasse les limites, ce qui a ouvert la voie à 2 autres!`\`
au lieu de"\\"
c=""
vers la deuxième ligne, puis supprimé la nouvelle ligne qui la suitwhile
(merci à @fergusq pour l'avoir repéré)a=X
instructions if+1
à la finindexOf
et restructuration pour économiser 2 octetsuntil[c=";"]
au lieu dewhile[c!=";"]
l.=[" "]*L
la source
x=((x+X)%#l)
au lieu dex+=X
. Malheureusement,(-1)%#l
revient toujours-1
.y
trop:y=y%#f
.key
place decmp
et utiliser à la{...}while[...]
place dewhile[...]do ... done
.Python 2,
262243237235234233231221219218217 octetsPrend l'entrée comme
['<line_1>', '<line_2>', ...]
Essayez-le en ligne!
-19 octets grâce à @math_junkie
-6 octets grâce à @ThisGuy
-2 octets en extrayant
max(map(L,i))
vers une variable (car elle est théoriquement utilisée deux fois).-1 octet en réduisant le nombre d'
i[y][x]
apparitions.-1 octet en utilisant
'\x00'
donc je n'ai pas à faire la[1:]
partie deo[1:]
la sortie-2 octets en utilisant
\0
au lieu de\x00
-10 octets grâce à @KritixiLithos pour se rendre compte que je peux remplir autant que je veux sur le côté droit parce que le extra sera ignoré
(pas de changement d'octet) bug fixe car la variable extraite était en dehors de la boucle
-2 octets car maintenant je n'utilise que
len
2 fois donc la réaffectation prend 2 octets supplémentaires-2 octets en utilisant
while';'not in o
au lieu dewhile o[-1]!=';'
et en utilisanto=''
au lieu deo='\0'
. Cela permet non seulement d'économiser 2 octets, mais aussi de supprimer le premier octet nul qui n'était techniquement pas vraiment valide.Explication
la source
try
depuis lefind
retour-1
s'il n'est pas trouvé: TIOlen
à une variable, par exempleL
pour enregistrer 3 octets et 4 autres en changeant l'affectation multiligne0
en 1 lignex=y=k=0
.Rubis,
274200187183Réduit quelques caractères supplémentaires en supprimant le tableau de quantité de mouvement,
d
.Je suis assez fier de celui-ci. C'était amusant! Il prend un tableau de chaînes et renvoie la chaîne appropriée.
Commenté ci-dessous.
la source
PHP 7,
291260 octetsla source
JavaScript,
242236235231220 octetsEssayez-le en ligne!
la source