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
quelle
/
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.)Antworten:
JavaScript (ES6), 158 Byte
Entwickelt unabhängig von @ tshs Antwort, obwohl auffallend ähnlich.
Die Zuordnung von Richtungen
^<v>
zu Ganzzahlen 0-3 wird von der Tatsache bestimmt, dass.search('^')
0 zurückgegeben wird, da^
es sich um ein reguläres Zeichen handelt.quelle
Haskell ,
333325 BytesBEARBEITEN:
f
Pointfree gemacht und eingebunden inb
.b
Nimmt eine Liste vonString
s und gibt ein zurückInteger
.Probieren Sie es online!
Wie es funktioniert
C a
Dieser Datentyp wird verwendet, weil Haskell nicht zulässt, dass ein Typ rekursiv ist, ohne ihn explizit zu deklarieren.C
ist auch ein Wrapping-Konstruktor undc
die entsprechende Unwrapping-Funktion. Es wird nur mit verwendeta=[Int]
.C [Int]
repräsentiert einen Zellenbefehl als eine Funktion, die ein direction ([Int]
) - Argument annimmt und ein Paar aus einer neuen Richtung und einem neuenC [Int]
Wert zurückgibt .b
ist die Hauptfunktion. Es konvertiert jedes Zeichen in einenC
Wert und ruft dann auf#
.g
ist das Gitter als Liste von Zeichenfolgen.\
escape-Zeichen und damit das längste zu erwähnende Zeichen sein müssen, wird dessen Ergebnis stattdessen als Standardwert für die Listensuche verwendet.#
Führt die Hauptsimulation aus, prüft Grenzen&
und generiert neue Gitter mit?
.[y,x]
ist die aktuelle Position,d
die aktuelle Richtung undg
das aktuelle Raster.[f,e]
ist die nächste Richtung undn
ist ein Paar davon und das nächste Gitter.l&i
prüft, ob der Indexi
für die Liste außerhalb der Grenzen liegtl
. (Es kehrtTrue
für außerhalb der Grenzen zurück, da dies eine Dummy-Guard-Bedingung in vermeidet#
.)f(l!!i)==(d,x)
,(f?i)l==(d,m)
wom
die Listel
mit demi
te Elemente ersetzt mitx
.(?i)
handelt es sich um eine allgemeinere Linse, die sich auf das i-te Element einer Liste konzentriert und in diesem Fall mit der Funktionsinstanz verwendet wird(,) [Int]
.n
ist die Funktion, die einen Punkt darstellt.a v
ist eine Funktion, die einen Pfeil in Richtung darstelltv
.m s
ist eine Funktion, die einen Spiegel darstellt;s==1
für\\
unds==-1
für/
.quelle
JavaScript, 172 Byte
Aber ich kann den letzten Testfall nicht testen, da auf meinem Computer ein Stapelüberlauf aufgetreten ist. (sollte funktionieren, wenn es eine Maschine mit größerem RAM gibt)
Wir verwenden eine Nummer für die Richtung:
Sei
d
die Richtungszahl ...Lassen Sie
(x, y)
aktuelle Position sein, die nächste Position ist:x+(t&1&&t-2)
,y+(~t&1&&t-1)
Hinweis:
Die Funktion nimmt einen Parameter mit folgendem Format an:
Teste es hier
quelle
Uncaught RangeError: Maximum call stack size exceeded
mit 16GB RAM.var
Deklarationen den letzten Testfall bestehen (js-Interpreter optimiert Tail Call im Strict-Modus)C
232221 BytesÜbernimmt die Eingabe im ersten Argument und gibt das Ergebnis aus. Erfordert, dass die Eingabe mindestens eine neue Zeile enthält. (Wenn also nur eine Zeile vorhanden ist, muss diese mit einer neuen Zeile enden.)
Anwendungsbeispiel:
Nervenzusammenbruch:
quelle
Python 3 , 286 Bytes
[f () nimmt Eingaben in der Form von an,
{(0,0):'/',(0,1):'.'}
daher habe ich auch eine Funktion g () geschrieben, um ein Array von Zeilen in diese Form umzuwandeln]Probieren Sie es online!
quelle