Ich stelle stolz vor ...
<}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111
? @
:" }}_47}_95 3""""""""(
_ : } _ } {=}
2 23_}29_ _ ; : \
0 ; 3 +_( 3_" 60{ .{.{.
"-_95:}}"" 2 0 ) 2 " _ _ {
"" _ : 2 _ ."(; } 3 .{
;_92}_47} : _ 0 = : * ;
: "" 2 {.{{ . -""(
}}:59_}}:::: "";_ . { _ "
} " {.{.{. 32.
}}}_95:}}}}_20-
... mein neues zweidimensionales Esolang-Labyrinth! Der obige Code ist nicht besonders gut umgesetzt (es gibt 161 Felder und 25 NOPs, so dass ein besseres Layout dies erheblich verkürzen könnte), aber ich konnte zumindest zeigen, dass die Sprache für nicht-triviale Aufgaben geeignet ist. :)
Wie es funktioniert
Zunächst ein kurzer Überblick über die Sprache:
- Labyrinth arbeitet mit zwei Stapeln, Haupt- und Hilfsstapel , in denen beliebige Ganzzahlen mit Vorzeichen gespeichert werden können. Am Ende beider Stapel befindet sich eine unendliche Anzahl von Nullen.
- Befehle sind einzelne Zeichen in einem 2D-Raster und bilden ein Labyrinth (dh unbekannte Zeichen, insbesondere Leerzeichen, sind Wände).
"
ist ein NOP, der keine Pinnwand ist und zum Auffüllen bestimmter Pfade im Code hilfreich sein kann. Im Gegensatz zu vielen anderen 2D-Sprachen werden die Kanten nicht umbrochen.
- Der Anweisungszeiger (IP) beginnt beim ersten Zeichen ohne Wand (in Lesereihenfolge), das sich nach rechts bewegt.
@
Beendet das Programm.
- Wenn möglich, folgt die IP Korridoren (auch um Kurven). Wenn die IP mehrere Zellen hat, auf die verschoben werden soll, wird sie im Allgemeinen nach links gedreht, wenn der obere Rand des Hauptstapels negativ ist, geradeaus, wenn er null ist, oder nach rechts, wenn er positiv ist. Wenn die IP gegen eine Wand stößt, kehrt sie die Richtung um. (Es gibt noch ein paar Feinheiten, aber diese sollten für diesen Code keine Rolle spielen.) Dies ist die einzige Möglichkeit, den Steuerungsfluss zu implementieren.
- Abgesehen von Rechen- und Stapelmanipulationsbefehlen kann der Quellcode zur Laufzeit mit den vier Befehlen geändert
>v<^
werden, die eine Zeile oder Spalte des Quellcodes zyklisch um eine Zelle verschieben. Welche Zeile oder Spalte betroffen ist, hängt von der Stapelspitze ab. Wenn die eigene Zeile oder Spalte der IP verschoben wird, bewegt sie sich mit der Verschiebung. Dies ermöglicht es, von einer Kante des Quellcodes zur anderen zu springen.
Für diese besondere Herausforderung ist hier die allgemeine Idee des Algorithmus:
- Schieben Sie die Enden der Autos bis zu den Motorhauben (dh
/ \_o oo o
) auf den Zusatzstapel.
- Lesen Sie die Eingabe und bestimmen Sie, ob Sie drücken
__
oder als /\
nächstes.
- Schieben Sie den Rest der Autos (dh
__ __ _/ \
und zwei führende Leerzeichen) auf den Zusatzstapel.
- Klemmen Sie den Eingang auf einen Maximalwert von
20
, nennen wir diese N .
- Jetzt mache 3 mal folgendes:
- Drucken N Plätze.
- Drucken Sie 6 gespeicherte Zeichen.
- Drucken Sie 60 - 3 * N Leerzeichen.
- Drucken Sie 6 gespeicherte Zeichen.
- Drucken Sie eine neue Zeile.
Schauen wir uns zum Schluss einige Teile des Codes an. Die IP beginnt in der oberen linken Ecke mit einem Befehl zum Verschieben des Rasters. Der obere Teil des Hauptstapels ist 0
(der als relativer Index verwendet wird), daher wird die erste Zeile nach links verschoben, wodurch auch die IP an das rechte Ende des Rasters verschoben wird. Jetzt wird die erste Zeile einfach von rechts nach links ausgeführt, wodurch der erste Satz fester Zeichen auf den Zusatzstapel verschoben wird:
}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111<
Diese Zeilenverschiebung ist nützlich zum Golfen, wenn Sie mit einer großen Menge linearen Codes beginnen möchten.
Als nächstes lesen wir die Eingabe und schieben die richtigen Hauben:
?
:"
_
2
0 ;
"-_95:}}""
"" _
;_92}_47}
Das linke Bit mit den drei NOPs sendet negative Ergebnisse entlang des oberen Zweigs und nicht negative Ergebnisse entlang des unteren Zweigs. Rechts werden sie wieder zusammengefügt.
Nun folgt ein weiterer großer linearer Abschnitt (der wahrscheinlich mit einem anderen Trick zum Verschieben von Reihen viel Golf gespielt werden könnte):
}}_47}_95
: }
23_}29_ _
3
2
:
:
:
}}:59_}}::::
}
}}}_95:}}}}
Dies drückt den Rest der Autos auf den Hilfsstapel.
Als nächstes berechnen wir min(20, input)
, was dem ersten Zweig ähnlich ist:
;
+_(
0 )
2 _
_ 0
"" 2
"";_
"
_20-
Schließlich haben wir die Schleife, die dreimal ausgeführt wird, um die Zeilen zu drucken. Jede Iteration der Schleife enthält zwei kleine (3x3) Schleifen zum Drucken der Leerzeichen sowie zwei Abschnitte zum Drucken von 6 Zeichen aus dem Zusatzstapel:
@
3""""""""(
_ } {=}
: \
3_" 60{ .{.{.
2 " _ _ {
."(; } 3 .{
= : * ;
{.{{ . -""(
. { _ "
{.{.{. 32.
Ein guter Trick, auf den ich gerne aufmerksam machen möchte, ist der .{.{.
am rechten Rand. Dies ist eine Sackgasse. Abgesehen von der Sackgasse wird .
der Code zweimal ausgeführt, einmal vorwärts und einmal rückwärts. Dies bietet eine gute Möglichkeit, den Palindrom-Code zu verkürzen (der Haken ist, dass Sie sicherstellen müssen, dass die IP die richtige Kurve nimmt, wenn Sie die Sackgasse wieder verlassen).
/ \
und nicht runter sind_ _
?