}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous ist eine 8-Bit-Sprache mit Werten, die nur durch Murmeln in einer Rube Goldberg-ähnlichen Maschine dargestellt werden. Dies war also nicht sehr einfach. Dieser Ansatz entspricht in etwa dem folgenden Pseudocode:
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
Da der Maximalwert 256 ist (dargestellt durch 0 im Marbleous-Programm, das an verschiedenen Stellen unterschiedlich gehandhabt wird), wird recursiveFunction (1) aufgerufen, 256!*512^256
wovon insgesamt ungefähr gleich sind 10^1200
, was leicht genug ist, um das Universum zu überleben.
Marbelous hat keinen sehr schnellen Interpreter, es scheint, als könne er 10^11
Aufrufe dieser Funktion pro Jahr ausführen , was bedeutet, dass wir eine Laufzeit von 10^1189
Jahren haben.
Weitere Erklärung der Marmorplatte
00@0
--/\=0
\\@0&0
00
ist ein Sprachliteral (oder ein Marmor), das hexadezimal dargestellt wird (also 0). Diese Murmel fällt auf die --
, die jede Murmel um 1 dekrementiert (00 wird umbrochen und in FF oder 255 in Dezimalzahl umgewandelt). Der Marmor mit jetzt dem Wert FF fällt auf den, \\
der ihn eine Spalte nach rechts nach unten schiebt @0
. Dies ist ein Portal, das den Marmor zum anderen @0
Gerät teleportiert . Dort landet der Marmor auf dem /\
Gerät, bei dem es sich um einen Duplikator handelt. Er platziert eine Kopie des Marmors auf der --
linken Seite (dieser Marmor wird zwischen den Portalen weitergeschleift und bei jeder Schleife dekrementiert) und eine Kopie auf der =0
rechten Seite.=0
vergleicht den Marmor mit dem Wert Null und lässt den Marmor fallen, wenn er gleich ist, und schiebt ihn nach rechts, wenn nicht. Wenn der Marmor den Wert 0 hat, landet er auf &0
einem Synchronisator, den ich später noch erläutern werde.
Alles in allem beginnt dies einfach mit einer Murmel mit dem Wert 0 in einer Schleife und dekrementiert sie, bis sie wieder den Wert 0 erreicht. Anschließend wird diese Murmel mit dem Wert 0 in einen Synchronizer gelegt und die Schleife wird gleichzeitig fortgesetzt.
}0@1
&0/\>0!!
--
@1
}0
Ist ein Eingabegerät, wird anfangs die n-te (Basis 0) Befehlszeileneingabe beim Aufrufen des Programms in jedes }n
Gerät eingefügt. Wenn Sie dieses Programm also mit der Befehlszeileneingabe 2 aufrufen, wird dies durch einen 02-Wert ersetzt }0
. Diese Murmel fällt dann in das &0
Gerät, ein weiterer Synchronisierer, &n
Synchronisierer halten Murmeln, bis auch alle anderen Entsprechungen &n
abgelegt sind. Der Marmor wird dann dekrementiert, teleportiert und dupliziert, ähnlich wie in der zuvor erläuterten Schleife. Die richtige Kopie wird dann mit zero ( >0
) auf Ungleichheit überprüft. Wenn sie nicht 0 ist, fällt sie durch. Wenn es 0 ist, wird es nach rechts gedrückt und landet auf !!
, wodurch das Board beendet wird.
Okay, bis jetzt haben wir eine Schleife, die kontinuierlich von 255 auf 0 herunterzählt und eine andere, ähnliche Schleife (gespeist von der Befehlszeileneingabe) jedes Mal einmal ausführen lässt, wenn sie 0 trifft. Wenn diese zweite Schleife n-mal ausgeführt wurde (maximal 256) ) Das Programm wird beendet. Das sind also maximal 65536 Runden der Schleife. Nicht annähernd genug, um das Universum zu überleben.
}0
--@2
@2/\=0MB
Dies sollte vertraut aussehen, die Eingabe wird einmal dekrementiert, dann wird dieser Wert in einer Schleife verschoben und kopiert (beachten Sie, dass die Murmel nur einmal dekrementiert wird, nicht bei jedem Durchlauf der Schleife). Es wird dann auf Gleichheit mit 0 geprüft und wenn es nicht Null ist, landet es auf MB
. Dies ist eine Funktion in Marbelous, jede Datei kann mehrere Karten enthalten und jede Karte ist eine Funktion, jede Funktion muss durch Voranstellen des Gitters mit benannt werden :[name]
. Jede Funktion mit Ausnahme der ersten Funktion in der Datei, die einen Standardnamen hat: MB. Diese Schleife ruft also die Hauptplatine fortlaufend erneut mit dem Wert auf, n - 1
wobei n der Wert ist, mit dem diese Instanz der Funktion aufgerufen wurde.
Warum also n*512
?
Nun, die erste Schleife läuft in 4 Ticks (und 256-mal) und die zweite Schleife läuft n-mal, bevor das Board endet. Dies bedeutet, dass das Board ungefähr n*4*256
Ticks läuft . Die letzte Schleife (die den rekursiven Funktionsaufruf ausführt) ist kompakter und läuft in 2 Ticks, was bedeutet, dass sie die Funktionszeiten aufruft n*4*256/2 = n*512
.
Welche Symbole haben Sie nicht erwähnt?
\/
ist ein Mülleimer, mit dem Murmeln vom Brett entfernt werden. Auf diese Weise wird sichergestellt, dass verworfene Murmeln andere Murmeln, die eine Runde durchlaufen, nicht stören und verhindern, dass das Programm beendet wird.
Bonus
Da Murmeln, die vom Boden einer Marmorplatte fallen, an STDOUT ausgegeben werden, druckt dieses Programm während der Ausführung eine Vielzahl von ASCII-Zeichen.