Diese Herausforderung ist ein Preis für ais523 für den Gewinn der Kategorie " Rookie of the Year " in " Best of PPCG 2016 ". Herzliche Glückwünsche!
BackFlip ist eine esoterische Programmiersprache des Benutzers ais523 , der weit über 30 weitere interessante Esolangs erstellt hat .
BackFlip ist eine 2D-Sprache wie Befunge oder > <>, bei der der Anweisungszeiger ein Textgitter (das Programm) durchläuft und sich je nach aktiviertem Zeichen nach oben, unten, links und rechts bewegt. Kritisch ist, dass sich das Raster in einem BackFlip-Programm beim Durchlaufen ändert, ähnlich wie bei Langton's Ant .
Bei dieser Herausforderung können Sie davon ausgehen, dass ein BackFlip-Programm immer ein rechteckiges Textgitter ist (alle Zeilen sind gleich lang), das mindestens 1 × 1 groß ist und nur die Zeichen enthält ./\<>^V
. ( .
dient eher der Sichtbarkeit als dem Raum.) Semantisch ist der hier verwendete BackFlip identisch mit der ursprünglichen Spezifikation .
Der Anweisungszeiger (IP) in BackFlip beginnt immer links von der oberen linken Ecke des Programms und zeigt nach rechts. Es gibt drei Arten von Befehlen:
.
ist ein No-Op. Die IP fährt in der Richtung fort, in die sie ging. Das No-Op bleibt ein No-Op./
und\
sind Spiegel. Sie reflektieren die IP in der durch ihren Winkel angegebenen Richtung und wechseln dann in den anderen Spiegeltyp .- Wenn zum Beispiel die IP-Köpfe nach links in a zeigen
\
, bewegt sie sich nach oben anstatt nach links und\
wird zu a/
.
- Wenn zum Beispiel die IP-Köpfe nach links in a zeigen
<
,>
,^
, UndV
sind Pfeile. Sie leiten die IP in die Richtung um, in die sie zeigen, und verwandeln sich dann in einen Pfeil, der in die Richtung zeigt, aus der die IP stammt (entgegen der Richtung, in die sich die IP bewegt hat) .- Wenn sich die IP beispielsweise nach unten
>
bewegt, beginnt sie, sich nach rechts und nicht nach unten zu bewegen, und>
wird zu einem,^
weil dies die Richtung ist, aus der die IP stammt.
- Wenn sich die IP beispielsweise nach unten
Ein BackFlip-Programm wird beendet, wenn sich die IP außerhalb der Grenzen bewegt, dh das Raster verlässt. Es stellt sich heraus, dass alle BackFlip-Programme irgendwann enden, weil Endlosschleifen unmöglich sind. (Sie können davon ausgehen, dass dies der Fall ist.)
Ihr Ziel bei dieser Herausforderung ist es, ein Programm oder eine Funktion zu schreiben, die ein BackFlip-Programm aufnimmt und die Anzahl der Bewegungen ausgibt, die der Befehlszeiger ausführt, bevor das Programm beendet wird. Das heißt, wie viele Schritte unternimmt die IP, um ein Programm auszuführen? Dies beinhaltet den ersten Schritt auf das Gitter und den letzten Schritt davon.
Zum Beispiel macht der Befehlszeiger 5 Schritte im Trivialraster ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
So die Ausgabe ....
heißt 5
.
Im komplexeren 4 × 2-Raster
\...
\.><
Die IP verlässt das Raster in ihrem neunten Schritt. Die Ausgabe lautet also 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
Der kürzeste Code in Bytes gewinnt.
Falls gewünscht, können Sie Eingaben als ein Array von Zeilen oder eine Matrix von Zeichen anstelle einer mehrzeiligen Zeichenfolge verwenden, aber Sie müssen die Zeichen verwenden ./\<>^V
(keine Ganzzahl-Opcodes). Sie können statt des .
gewünschten Leerzeichens auch Leerzeichen verwenden . Es ist in Ordnung, wenn Zeichen wie \
in der Eingabe maskiert werden müssen. Ausgabe ist immer eine ganze Zahl mehr als eins.
Testfälle
....
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
/
gehen, wird die IP nach oben /
gehen, und wenn Sie nach oben gehen, wird die IP nach rechts gehen, als ob es ein Ball wäre, der von einer Wand abprallt. (Aber denken Sie an die /
Änderungen an Backslash, nachdem die IP es berührt.)