.
Ajax,.
Ford,.
Act I:.
Scene I:.
[Enter Ajax and Ford]
Scene II:.
Ford:
Open your mind.Is sky nicer than you?If so, let us return to scene IV.
Ajax:
Open your mind.You is sum you and sum big big big big big big pig and big big big big cat!
Scene III:.
Ford:
Speak thy mind.
Ajax:
You is sum you and pig!Is you as big as zero?If so, let us return to scene II.Let us return to scene III.
Scene IV:.
[Exeunt]
Ungolfed-Version:
The Decoding of the Lengths of Veronan Runs - A Drama of PPCG.
Romeo, quite a character.
Juliet, Romeo's lover and multiplicand.
Act I: In which the lengths of runs are decoded.
Scene I: A silent entrance.
[Enter Romeo and Juliet]
Scene II: In which neither Romeo nor Juliet believes the other open-minded.
Juliet:
Open your mind. Is my mother jollier than thou? If so,
we must proceed to scene IV.
Romeo:
Open your mind. Thou art the sum of thyself and the sum of my good aunt and
the difference between nothing and the quotient of the square of twice the sum
of thy foul fat-kidneyed goat and thy death and thy evil variable!
Scene III: In which Romeo snaps and brutally insults Juliet.
Juliet:
Speak thy mind.
Romeo:
Thou art the sum of thyself and a hog! Art thou as rotten as nothing? If so,
let us return to scene II. Let us return to scene III.
Scene IV: Finale.
[Exeunt]
Ich verwende den Python-SPL-Compiler von drsam94 , der einige Fehler aufweist (weshalb ich ihn beispielsweise Open your mindanstelle Open thy mindder Golfversion verwende).
Um dieses Programm auszuführen, verwenden Sie:
$ python splc.py rld.spl > rld.c
$ gcc rld.c -o rld.exe
$ echo -n ":144,1'1" | ./rld
:4444,'
Wie es funktioniert
SPL ist eine esoterische Programmiersprache, mit der Programme wie Shakespeare-Stücke aussehen. Dabei werden Zeichen als Variablen verwendet, und die Verarbeitung wird ausgeführt, indem die Zeichen Dinge zueinander sagen.
The Decoding of the Lengths of Veronan Runs - A Drama of PPCG.
Dies ist der Titel des Stücks; es wird vom Compiler ignoriert.
Romeo, quite a character.
Juliet, Romeo's lover and multiplicand.
Hier deklarieren wir die im Rest des Programms verwendeten Variablen. Alles zwischen ,und .wird vom Compiler ignoriert. In diesem Fall deklarieren wir Romeo, um das zu dekodierende Zeichen zu speichern, und Juliet, um die Lauflänge des Zeichens zu speichern.
Act I: In which the lengths of runs are decoded.
Hier deklarieren wir die erste und einzige Handlung im Programm. Acts und Szenen sind wie Labels. Sie können jederzeit mit let us return to scene IIoder einer Variante davon angesprungen werden . Wir verwenden nur einen Akt, weil er für unsere Bedürfnisse ausreicht. Auch hier wird alles zwischen :und .vom Compiler ignoriert.
Scene I: A silent entrance.
Hier deklarieren wir die erste Szene. Szenen sind in römischen Ziffern nummeriert: die erste ist Scene I, die zweite Scene IIund so weiter.
[Enter Romeo and Juliet]
Dies ist eine Regie; Darin teilen wir den Variablen Romeound Julietmit, dass sie die "Bühne" betreten sollen. Es können nur zwei Variablen gleichzeitig auf der "Bühne" sein. Die Stufe wird verwendet, damit der Compiler herausfinden kann, welche Variable welche adressiert, wenn sie sprechen. Da wir nur zwei Variablen haben, bleiben Romeo und Julia für die Dauer des Programms auf der Bühne.
Scene II: In which neither Romeo nor Juliet believes the other open-minded.
Eine weitere Szenendeklaration. Szene II wird angesprungen, um eine andere Lauflänge zu dekodieren.
Juliet:
Diese Form der Erklärung bedeutet, dass Julia anfängt zu sprechen. Alles bis zur nächsten Romeo:, Regieanweisung oder Szenen- / Handlungserklärung wird eine Linie sein, die von Julia gesprochen wird, und so wird sich "ich" auf Julia, "du" / "du" auf Romeo usw. beziehen.
Open your mind.
Dieser Befehl speichert den Ordnungswert eines einzelnen Zeichens aus STDIN in Romeo.
Is my mother jollier than thou?
In der SPL werden Substantive entweder zu 1 oder -1 übersetzt, je nachdem, ob sie positiv oder negativ sind. In diesem Fall my motherbedeutet dies 1. Adjektive (positiv oder negativ) multiplizieren ihr Substantiv mit 2.
Das ist eine Frage; my motherDarin fragt Julia, ob (AKA 1) "lustiger" ist als Romeo. Vergleichswerte übersetzen entweder nachless than (wenn sie negativ sind, wie worse) oder greater than(wenn sie positiv sind, wie jollier) übersetzt. Daher läuft diese Frage auf Is 1 greater than you?.
Der Grund, warum wir diese Frage stellen, besteht darin, das Ende der Eingabe zu erkennen. Da der Wert von EOFvon Plattform zu Plattform unterschiedlich ist, normalerweise aber unter 1 liegt, wird er von uns zur Erkennung verwendet.
If so, we must proceed to scene IV.
Wird die vorhergehende Frage zu ausgewertet true , springen wir zu Szene IV, was einfach das Ende des Programms ist. Kurz gesagt, wenn wir eine EOF feststellen, beenden wir das Programm.
Romeo:
Es ist jetzt Romeos Linie: "Ich" und "Du" beziehen sich auf Romeo bzw. Julia.
Open your mind.
Diese Anweisung setzt den Ordnungswert eines einzelnen Zeichens aus STDIN in Juliet. Dies ist in diesem Fall die Lauflänge des in gespeicherten Zeichens Romeo .
Thou art the sum of thyself and the sum of my good aunt and the difference
between nothing and the quotient of the square of twice the sum of thy foul
fat-kidneyed goat and thy death and thy evil variable!
Dies ist zu lang, um es im Detail zu besprechen, aber vertraue mir einfach, dass es übersetzt wird Juliet -= 48. Wir tun dies, weil Juliet den ASCII-Wert einer Ziffer enthält, undord('0') == 48 ; Beim Subtrahieren von 48 übersetzen wir den ASCII-Wert einer Zahl in die Zahl selbst.
Scene III: In which Romeo snaps and brutally insults Juliet.
Eine weitere Szenendeklaration. Dieser ist für die Schleife, in der wir wiederholt den Zeichenwert von Romeo,Juliet times .
Juliet:
Speak thy mind.
Diese Aussage veranlasst Romeo, seinen Wert als Zeichen auszudrucken. Das heißt, der zuvor in Romeo gespeicherte Zeichenwert wird jetzt ausgegeben.
Romeo:
Thou art the sum of thyself and a hog!
Ein Schwein ist ein negatives Substantiv a hog. daher wird diese Aussage zu ausgewertet Juliet -= 1.
Art thou as rotten as nothing?
Romeo fragt hier, ob Juliet "so faul wie" oder gleich 0 ist.
If so, let us return to scene II.
Wenn Julias Wert 0 ist, kehren wir zu Szene II zurück, um die Lauflänge eines anderen Charakters zu dekodieren.
Let us return to scene III.
Ansonsten kehren wir zu Szene III zurück, um Romeos Charakter erneut auszugeben.
Scene IV: Finale.
[Exeunt]
Diese endgültige Szenendeklaration ist nur eine Markierung für das Ende des Programms. Die [Exeunt]Regieanweisung ist erforderlich, damit der Compiler die endgültige Szene generiert.