_8
,%
;
"}{{+_5
"= %_!
= """{
;"{" )!
Beendet mit einem Division-durch-Null-Fehler (Fehlermeldung bei STDERR).
Probieren Sie es online!
Das Layout fühlt sich wirklich ineffizient an, aber ich sehe gerade keinen Weg, es zu spielen.
Erläuterung
Diese Lösung basiert auf Dennis 'arithmetischem Trick: Nehmen Sie alle Zeichencodes modulo 8
, fügen Sie ein Paar von beiden Enden hinzu und stellen Sie sicher, dass es durch teilbar ist5
.
Labyrinth-Grundierung:
- Labyrinth hat zwei Stapel von Ganzzahlen mit beliebiger Genauigkeit, main und aux (iliary), die anfänglich mit einer (impliziten) unendlichen Menge von Nullen gefüllt sind.
- Der Quellcode ähnelt einem Labyrinth, in dem der Anweisungszeiger (IP) nach Möglichkeit Korridoren folgt (sogar um Ecken). Der Code beginnt beim ersten gültigen Zeichen in der Lesereihenfolge, in diesem Fall also in der linken oberen Ecke. Wenn die IP zu einer beliebigen Art von Junction gelangt (dh zu mehreren benachbarten Zellen zusätzlich zu derjenigen, von der sie stammt), wählt sie eine Richtung aus, die auf der Oberseite des Hauptstapels basiert. Die Grundregeln sind: Links abbiegen, wenn negativ, weiterfahren, wenn null, rechts abbiegen, wenn positiv. Und wenn eine davon nicht möglich ist, weil es eine Mauer gibt, dann geht die IP in die entgegengesetzte Richtung. Die IP dreht sich auch um, wenn Sackgassen getroffen werden.
- Ziffern werden verarbeitet, indem die Oberseite des Hauptstapels mit 10 multipliziert und dann die Ziffer hinzugefügt wird.
Der Code beginnt mit einer kleinen 2x2-Schleife im Uhrzeigersinn, die alle Eingangsmodule 8 liest:
_ Push a 0.
8 Turn into 8.
% Modulo. The last three commands do nothing on the first iteration
and will take the last character code modulo 8 on further iterations.
, Read a character from STDIN or -1 at EOF. At EOF we will leave loop.
Jetzt ;
wirft die -1
. Wir betreten eine weitere Schleife im Uhrzeigersinn, die den oberen Teil des Hauptstapels (dh das letzte Zeichen) nach unten bewegt:
" No-op, does nothing.
} Move top of the stack over to aux. If it was at the bottom of the stack
this will expose a zero underneath and we leave the loop.
= Swap top of main with top of aux. The effect of the last two commands
together is to move the second-to-top stack element from main to aux.
" No-op.
Jetzt gibt es ein kurzes lineares Bit:
{{ Pull two characters from aux to main, i.e. the first and last (remaining)
characters of the input (mod 8).
+ Add them.
_5 Push 5.
% Modulo.
Die IP befindet sich jetzt an einer Kreuzung, die als Verzweigung dient, um die Teilbarkeit durch 5 zu testen. Wenn das Ergebnis des Modulos nicht Null ist, wissen wir, dass die Eingabe kein Watson-Crick-Palindrom ist, und wenden uns nach Osten:
_ Push 0.
! Print it. The IP hits a dead end and turns around.
_ Push 0.
% Try to take modulo, but division by zero fails and the program terminates.
Andernfalls müssen wir den Rest der Eingabe überprüfen, damit die IP weiter nach Süden geht. Der {
zieht über den unteren Rand der verbleibenden Eingabe. Wenn die Eingabe erschöpft ist, ist dies a 0
(von der Unterseite von aux ), und die IP bewegt sich weiter nach Süden:
) Increment 0 to 1.
! Print it. The IP hits a dead end and turns around.
) Increment 0 to 1.
{ Pull a zero over from aux, IP keeps moving north.
% Try to take modulo, but division by zero fails and the program terminates.
Andernfalls müssen mehr Zeichen in der Zeichenfolge überprüft werden. Die IP dreht sich nach Westen und bewegt sich in die nächste (im Uhrzeigersinn) 2x2-Schleife, die größtenteils aus No-Ops besteht:
" No-op.
" No-op.
{ Pull one value over from aux. If it's the bottom of aux, this will be
zero and the IP will leave the loop eastward.
" No-op.
Nach dieser Schleife haben wir die Eingabe wieder auf dem Hauptstapel, mit Ausnahme des ersten und letzten Zeichens und mit einer Null oben. Die ;
wirft die0
und dann =
die Stapeloberseiten, aber dies dient nur dazu, das erste =
in der Schleife abzubrechen , da wir die Schleife jetzt an einer anderen Stelle betreten. Spülen und wiederholen.