Ce défi est un prix pour ais523 pour avoir remporté la catégorie " Recrue de l'année " dans " Best of PPCG 2016 ". Toutes nos félicitations!
BackFlip est un langage de programmation ésotérique créé par l'utilisateur ais523 , qui a créé bien plus de 30 autres esolangs intéressants .
BackFlip est un langage 2D comme Befunge ou > <> où le pointeur d'instruction traverse une grille de texte (le programme), se déplaçant vers le haut, le bas, la gauche et la droite, changeant de direction en fonction du caractère sur lequel il se trouve. De manière critique, la grille d'un programme BackFlip change au fur et à mesure de sa traversée, un peu comme la fourmi de Langton .
Pour ce défi, vous pouvez supposer qu'un programme BackFlip est toujours une grille rectangulaire de texte (toutes les lignes de la même longueur), de taille 1 × 1 au minimum, contenant uniquement les caractères ./\<>^V
. ( .
est utilisé pour la visibilité plutôt que pour l'espace.) Sémantiquement, le BackFlip que nous utiliserons ici est identique à la spécification d'origine .
Le pointeur d'instruction (IP) dans BackFlip commence toujours juste à gauche du coin supérieur gauche du programme, se dirigeant vers la droite. Il existe trois types de commandes qu'il peut rencontrer:
.
est un no-op. L'IP continue dans la direction où il allait. Le no-op reste un no-op./
et\
sont des miroirs. Ils reflètent l'IP dans la direction indiquée par leur angle, puis ils se transforment en l'autre type de miroir .- Par exemple, si les têtes IP sont laissées dans un
\
, il commence à se déplacer vers le haut au lieu de gauche et le\
devient a/
.
- Par exemple, si les têtes IP sont laissées dans un
<
,>
,^
EtV
sont des flèches. Ils redirigent l'IP vers la direction dans laquelle ils pointent, puis ils se transforment en une flèche qui pointe dans la direction d'où provient l'IP (opposée à la direction dans laquelle l'IP se déplaçait) .- Par exemple, si l'IP se dirige vers le bas
>
, il commence à se déplacer vers la droite plutôt que vers le bas et>
devient un^
car c'est la direction d'où provient l'IP.
- Par exemple, si l'IP se dirige vers le bas
Un programme BackFlip se termine lorsque l'IP sort des limites, c'est-à-dire sort du réseau. Il s'avère que tous les programmes BackFlip finissent par se terminer car les boucles infinies sont impossibles. (Vous pouvez supposer que c'est vrai.)
Votre objectif dans ce défi est d'écrire un programme ou une fonction qui prend un programme BackFlip et génère le nombre de mouvements que le pointeur d'instruction prend avant la fin du programme. Autrement dit, combien d'étapes l'IP prend-il au cours de l'exécution d'un programme? Cela comprend l'étape initiale sur la grille et l'étape finale hors de celle-ci.
Par exemple, le pointeur d'instruction prend 5 étapes dans la grille triviale ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
Donc, la sortie ....
est 5
.
Dans la grille 4 × 2 plus complexe
\...
\.><
l'IP quitte la grille à sa 9e étape, donc la sortie est 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
Le code le plus court en octets gagne.
Vous pouvez prendre l'entrée comme un tableau de lignes ou une matrice de caractères au lieu d'une chaîne multiligne si vous le souhaitez, mais vous devez utiliser les caractères ./\<>^V
(pas les opcodes entiers). Vous pouvez utiliser l'espace au lieu de .
si vous préférez. C'est bien si des caractères comme \
doivent être échappés en entrée. La sortie est toujours un entier plus d'un.
Cas de test
....
5
\...
\.><
9
.
2
..
3
.
.
2
\
2
^
2
.^.
3
<.
2
\\
\/
7
>V
^<
6
>\
>/
6
\><
2
\><
\><
7
\><
\><
\><
12
\.V.
\.\<
5
\.V.
\./<
9
V./\
V./\
>./<
..\/
14
\V..
.^..
\/><
.V..
.^..
20
\.V.V.
\./.\<
.>\<..
..^.^.
31
\.V.V.V.
\./>/.\<
.>\>\<..
..^.^.^.
69
\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.
145
\.V.V.V.V.V.V.V.V.V.V.
\./>/>/>/>/>/>/>/>/.\<
.>\>\>\>\>\>\>\>\>\<..
..^.^.^.^.^.^.^.^.^.^.
9721
/
, l'IP montera et que vous vous dirigerez vers l'intérieur, /
l'IP ira à droite, comme s'il s'agissait d'une balle rebondissant sur un mur. (Mais souvenez-vous des /
changements apportés à la barre oblique inversée après que l'IP le touche.)