@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0
Es funktioniert nur für Werte unter 256, da Marbelous eine 8-Bit-Sprache ist.
Wie es funktioniert
Marbelous ist eine 2D-Sprache mit Werten, die durch 8-Bit-Murmeln dargestellt werden, die bei jedem Tick um eine Zelle nach unten fallen, es sei denn, ein Gerät verhindert, dass sie nach unten fallen. Dieses Marbelous-Programm besteht aus 3 Tafeln; Fangen wir mit dem einfachsten an:
:O
}0
+Z
+C
{0
:O
ist der Name der Karte (um genau zu sein, O ist der Name und: sagt dem Interpretierten, dass diese Zeile ein Name ist. Wenn Sie einer Karte einen Namen geben, können andere Karten darauf
}0
zugreifen. Dies ist ein Eingabegerät Argument dieser Funktion: Diese Zelle wird durch einen Eingabemurmel (Wert) ersetzt, wenn die Funktion aufgerufen wird.
+Z
Fügt jedem Marmor, der darüber läuft, 35 hinzu und lässt ihn fallen. +C
Führt dasselbe aus, fügt jedoch nur 12 hinzu. Ist {0
eine Ausgabezelle Wenn eine Kugel diese Zelle erreicht, wird die Funktion beendet und der Wert in diesem Ausgabegerät zurückgegeben.
Alles in allem nimmt dieses Board einen Wert an und addiert dann 47 dazu. Für uns bedeutet dies, dass jede einstellige Zahl in den ASCII-Code der Ziffer -1 umgewandelt wird (dies funktioniert natürlich auch für 10).
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
Dieses Board sieht etwas komplizierter aus. Sie sollten sich :I
als Name der Karte identifizieren können und einige Eingabe- und Ausgabegeräte entdeckt haben. Sie werden feststellen, dass wir zwei verschiedene Eingabegeräte haben }0
und }1
. Dies bedeutet, dass diese Funktion 2 Eingänge akzeptiert. Sie werden auch feststellen, dass es zwei Instanzen des }1
Geräts gibt. Beim Aufrufen der Funktion enthalten beide Zellen denselben Wert. Das }0
Eingabegerät befindet sich direkt über einem \/
Gerät, dies wirkt wie ein Mülleimer und entfernt jeglichen Marmor, der darauf fällt, sofort.
Werfen wir einen Blick darauf, was mit einem der Murmeln passiert, die von den }1
Eingabegeräten auf die Tafel gelegt werden:
}1
=9 &1
&0
{>
Es wird beim ersten Tick runterfallen und das =9
Gerät treffen . Dies vergleicht den Wert der Murmel mit 9 und lässt die Murmel fallen, wenn die Anweisung =9
mit through bewertet wird. Wenn nicht, wird der Marmor nach rechts gedrückt. &0
und &1
sind Synchronisierer. Sie halten sich an Murmeln fest, die auf sie fallen, bis auch alle anderen &n
Synchronisierer gefüllt sind. Wie zu erwarten ist, wird dies bedingt ein anderes Verhalten auf einem anderen Teil der Platine auslösen.
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
Wenn ich Ihnen sage, dass ++
es sich um einen Inkrementor handelt, sollten Sie bereits in der Lage sein, zu bestimmen, mit welchen Synchronisierungen die verschiedenen Synchronisierungen gefüllt werden. Die linke Seite &1
enthält den Eingabewert }1
+ 1, die &0
nächste 0 ( 00
ein hexadezimal dargestelltes Sprachliteral). Die zweite &1
enthält den Wert 1 und die rechte &0
wird mit einem gefüllt F7
, der 9 von einem Wert abzieht, da die Addition in Marbelous modulo 256 ist.
//
ist eine Ablenkvorrichtung, die jeglichen Marmor nach links drückt, anstatt ihn fallen zu lassen.
Wenn Sie dies alles zusammenfassen, erhalten Sie Folgendes: Wenn der Marmor in }1
9 ist, werden die &0
Synchronisierer gefüllt. Dies bewirkt, dass der Wert 0 in den {0
Ausgang und F7
(oder -9) in den {1
Ausgang fällt . Wenn }1
nicht 9, {0
wird mit }1
+ 1 gefüllt und {0
enthält 1. Es gibt auch ein {>
Gerät, dies ist ein spezieller Ausgang, der eine Kugel neben einer Tafel anstelle darunter ausgibt. Dies wird mit gefüllt, }1
wenn es gleich 9 ist.
@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Okay, jetzt zum Großen. Dieses Board hat keinen expliziten Namen, da es das Hauptboard der Datei ist. Der implizite Name lautet Mb
. Sie sollten in der Lage sein, einige Zellen zu erkennen. Es gibt ein Eingabegerät, einige Sprachliterale ( 00
und FF
). Es gibt einige Synchronisierer und einen Deflektor. Lassen Sie uns Schritt für Schritt durch diese.
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
Der Eingabewert (die Befehlszeileneingabe, da dies die Hauptplatine ist) beginnt also in der zweiten Zelle von oben, wo er }0
sich befindet. Es fällt herunter und erreicht das >0
Gerät, bei dem es sich um ein anderes Vergleichsgerät handelt. Jeder Marmor, der größer als 0 ist, fällt durch, jeder andere Marmor wird nach rechts gedrückt. (Da Marbelous-Variablen ohne Vorzeichen sind, wird nur genau 0 nach rechts verschoben.) Dieser Nullwert-Marmor trifft dann das @6
Gerät. Dies ist ein Portal und transportiert den Marmor zu einem anderen entsprechenden Portal, in diesem Fall direkt darüber. Die 0-Kugel erreicht dann den &0
Synchronisierer und löst einige Dinge an anderer Stelle aus.
Wenn der Marmor nicht 0 ist, fällt er nach unten, wird durch \\
Treffer nach rechts abgelenkt, --
wodurch er um eins verringert wird, und fällt dann auf /\
einen Kloner. Dieses Gerät nimmt eine Murmel und gibt eine Kopie davon rechts und eine links aus. Der linke wird nach oben zum anderen geführt, @0
wo der Marmor dieselbe Sequenz erneut durchläuft. Der linke wird woanders hingebracht. Dadurch erhalten wir eine Schleife, die die Befehlszeileneingabe einmal pro Schleife dekrementiert und bei jeder Schleife ein bestimmtes Verhalten auslöst, bis sie 0 erreicht. Anschließend wird ein anderes Verhalten ausgelöst.
Lassen Sie uns einen Blick darauf werfen, was mit dem Marmor passiert, der in @4
jede Schleife geschoben wird.
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Es gibt hier 3 Sprachliterale ( FF
), die sofort in Portale fallen. Diese Portale führen sie zu drei der II
Geräte. II
bezieht sich auf das Board, das :I
wir weiter unten in der Datei definiert haben. Da :I
es zwei verschiedene Eingabegeräte gibt, muss die Darstellung auf einer anderen Karte 2 Zellen breit sein. Da 6 Zellen enthalten sind II
, haben wir 3 Instanzen dieser Funktion auf dem Board.
Die FF
(oder 256 oder -1, wenn Sie wollen) Murmeln sitzen in den Eingabezellen der :I
Funktion und warten, bis genügend Eingabemurmeln vorhanden sind, um die Funktion zu starten (dh eine weitere). Hier kommt das @4
Portal ins Spiel. Dort fällt in jeder Schleife eine Kopie der dekrementierten Kommandozeilen-Eingabe durch. Dies wird das :I
Board ganz links auslösen . Anfänglich mit den Werten 256 (oder -1) und unabhängig von der Eingabe in der Befehlszeile mit -1. Die linke Murmel wird in die }0
Geräte der :I
Tafel und die rechte in die Murmel gelegt }1
. Wenn Sie sich erinnern, was dieses Board getan hat, können Sie feststellen, welches Ergebnis dies hat. Es gibt eine inkrementierte Version des rechten Eingangs auf dem linken Ausgang aus (und verwandelt eine 9 in eine 0, nicht in eine 10) und gibt entweder 1 oder -9 auf der rechten Seite aus.
Der inkrementierte Wert wird von einem Portal direkt in die rechte Eingabezelle zurückgeführt, und der Wert auf der rechten Seite fällt in einen Synchronizer. Wenn ein Synchronisierer bereits eine Kugel in der Hand hält, kollidieren die beiden Kugeln. Kollidierende Murmeln werden modulo 256 addiert. Die Werte in den Synchronisierern bewirken also Folgendes: Sie beginnen leer, drehen sich dann zu 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 und dann zu 1 wieder (da 247 Modulo 256 hinzugefügt wird).
Sie können sich auch daran erinnern, dass eine Murmel nach rechts ausgegeben wird, wenn der Eingabewert auf 0 zurückspringt. Da die :I
Karten direkt nebeneinander liegen, wird die Karte einmal nach rechts getriggert. Dies füllt die drei Synchronisierer mit Werten, die um eins höher sind, als sie sein sollten, um eine kurze Darstellung der Befehlszeileneingabe zu sein, bis diese auf 0 zurückgeschleift ist.
Sie können sich auch daran erinnern, dass die :O
Funktion einen Wert in den ASCII-Wert der Ziffer umwandelt, die den Wert -1 darstellt. Die Ausgabe dieser OO
Zellen fällt dann von der Platine, wodurch die entsprechenden ASCII-Zeichen an STDOUT ausgegeben werden.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
Was passiert also, wenn die Befehlszeileneingabemurmel 0 erreicht und diese &0
Synchronisierer füllt ? Nun, ein paar Murmeln mit dem Wert 0 fallen nach unten und lösen die drei Synchronisierungen aus, die die Ziffern (+ 1) der Shortlex-Zahl unten auf der Platine enthalten. &3
wird zuerst ausgelöst, da es die höchstwertige Ziffer enthält, &2
gefolgt von &1
. Dieser Marmor wird dann zum anderen @5
Gerät teleportiert, bevor er schließlich auf die !!
Zelle trifft , die das Board terminiert.
19, 20, 21, 22
in Dezimalzahlen auf08, 09, 10, 11
shortlex abbildet. Deshalb habe ich das verwirrt100 -> 89
!