`:_64/"32}
,` (3 :=-{
"`{"; _v2$ ;`3
"`".:@ ; ".5(`3.
< "" `^`;>
Eine weitere Zusammenarbeit mit @ MartinBüttner und auf der verrückteren Seite des Labyrinth-Spektrums - zum ersten Mal haben wir alle vier ^>v<
in einem Programm. Probieren Sie es online!
Erläuterung
Der allgemeine Algorithmus, der in einer Schleife ausgeführt wird, lautet wie folgt:
1. Read a char
2. If EOF:
3. Move all digits from auxiliary stack to main
4. Output all digits on main stack
5. Halt
Otherwise:
6. If char is a letter (c >= 64):
7. If random turns left:
8. Output char XOR 32
Otherwise:
9. Output char
Otherwise:
10. Shift char to auxiliary stack
11. If char is space (c-32 == 0):
12. Pull char back from auxiliary stack
13. Output underscore
Otherwise:
14. Continue loop
Um die Erklärung kompakt zu halten, ist hier ungefähr angegeben, wie jeder Teil des Programms dem obigen Pseudocode entspricht:
Hier sind die interessanten Teile.
Zufälligkeit im Labyrinth
Es gibt nur einen Weg, um Zufälligkeit in Labyrinth zu bekommen, und zwar, wenn die IP versucht, vorwärts zu gehen, aber 1) es gibt weder einen Pfad vorwärts noch rückwärts und 2) es gibt Pfade links und rechts. In diesem Fall wählt die IP zufällig zwischen der linken und der rechten Route.
Dies ist nur mit den ^>v<
Operatoren möglich, die n
die Zeile / Spalte n
um 1 verschieben. Zum Beispiel das Programm ( Online ausprobieren! )
" 1
""v!@
2
!@
Gibt entweder 1 oder 2 nach dem Zufallsprinzip aus, da die v
Spalte mit dem Offset 0 (dh die Spalte, in der die IP aktiv ist) um 1 verschoben wird, was ergibt
"
""1!@
v
2!@
Die IP zeigt nach rechts und versucht vorwärts zu gehen (Stack-Spitze ist Null), kann aber nicht. Es kann sich auch nicht rückwärts bewegen, also wählt es nach dem Zufallsprinzip zwischen links und rechts.
Golf-Tricks
Das Programm startet ab dem ersten Zeichen in der Lesereihenfolge. Sie werden feststellen, dass Schritt 6 tatsächlich ausgeführt wird. Wenn Sie jedoch aus einem leeren Labyrinth-Stapel herausspringen, erhalten Sie den Wert 0. Daher werden die Schritte 10 und 14 ausgeführt und verschieben eine Null in den Zusatzstapel, was effektiv ist ein No-Op.
Der Hauptstapel ist nach jeder Iteration praktisch leer, was es uns ermöglicht, das Codelayout mit >
und <
auf den impliziten Nullen am unteren Rand abzugrenzen. Das >
umschließt die untere Reihe um , so dass die IP bewegt sich von rechts unten nach links unten, und die <
Verschiebungen der Reihe zurück. Die IP bewegt sich dann glücklich in der linken Spalte nach oben, um die Schleife fortzusetzen.
Ziffern im Labyrinth platzen n
und drücken 10*n + <digit>
. Zusätzlich werden Zeichen vor der Ausgabe modulo 256 genommen. Wenn wir diese beiden zusammenfügen, können wir 95 (Unterstrich) ausgeben, indem wir `33
32 (Leerzeichen) verwenden, was funktioniert, weil -3233 % 256 = 95
. Auch wenn es andere Möglichkeiten gibt, 32 in 95 umzuwandeln (was ;95
am einfachsten ist), können wir den Code hier mit einer negativen Zahl ein wenig mit Linkskurven komprimieren.