Tipps zum Golfen in der Shakespeare-Programmiersprache

43

Welche allgemeinen Tipps haben Sie zum Golfen in der Shakespeare-Programmiersprache? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme anwenden lassen und die zumindest etwas spezifisch für SPL sind (z. B. "Kommentare entfernen" ist keine Antwort).

Bitte posten Sie einen Tipp pro Antwort.

Loovjo
quelle
17
Ich bin nicht sicher , dass Sie können Golf spielen SPL. SPL ist so ausführlich, dass ich fast das Gefühl habe, dass diese Frage das Code-Trolling-Tag benötigt. : P
Alex A.
Sie können SPL einfach nicht Golf spielen. Zumindest nach meinem schwachen Wissen über Shakesperianische Überlieferungen ...
Rodolfo Dias
@ RodolfoDias: Schwach? Ich denke, Sie sind der gebietsansässige Shakespeare-Gelehrte bei PPCG.
Alex A.
8
@AlexA. Was vielleicht nicht gut ist: Es bedeutet nur, dass ich so wahnsinnig bin, SPL zu verstehen :-)
Rodolfo Dias
@AlexA. Sp kann es tun ...
Conor O'Brien

Antworten:

18

(Na ja ... da dies meine ist angenommen Sprache 1 , ich fühle mich wie ich verpflichtet bin , hier etwas zu addieren)

Verwenden Sie kurze Variablennamen

Ja, ja, ja, das ist ziemlich normal für Code-Golf. Sie verwenden nur Variablennamen mit einem Buchstaben, keine Neuigkeiten. Oder ist da? Weil die Jungs, die SPL erstellt haben, so verrückt waren, dass sie keinen Namen für die Variablen ihrer Sprache zuließen: Sie müssen aus Shakesperian-Stücken stammen, was in Bezug auf die Länge der Charaktere ein Ärgernis für den König ist - aber wenn Sie SPL codieren , Das weißt du bereits. Daher würde ich raten, Zeichen mit kurzen Namen wie Ajax , Ford , Page oder Puck anstelle des Erzbischofs von Canterbury zu verwenden .

Ich fürchte, das ist alles, was ich habe.


1 - da meine Java-Kenntnisse denen eines Neugeborenen entsprechen.

Rodolfo Dias
quelle
1
Liste der Variablennamen .
user202729
13

(nach dem letzten habe ich mich nur an ein paar Dinge erinnert)

Wähle deinen Code sorgfältig aus

Ein Beispiel, um zu erklären, was dies bedeutet.

Ajax:
 You are as warm as a big red rich fair cute bold cat!

und

Ajax:
 Thou art as blossoming as an embroidered trustworthy bottomless peaceful charming handsome chihuahua!

Produziere genau das gleiche Ergebnis, das bewirkt , dass das gesprochene Zeichen den Wert 64 annimmt (da du, wenn du meinen langen Kampf mit SPL liest , weißt, dass beide Zeilen 2 * 2 * 2 * 2 * 2 * 2 * entsprechen). 1); Das erste hat jedoch 59 Bytes, während das zweite eine Byte-Zahl von 107 hat.

Trotzdem wird niemand so wahnsinnig, dass er mit SPL an einer Herausforderung teilnehmen kann, also ...

Rodolfo Dias
quelle
10
Könnten Sie das gleiche Adjektiv mehrfach in einer Beschreibung verwenden? Zum Beispiel a big big big big big big cat, Speicher 4 weiteres Bytes? Ich weiß, es ruiniert die Kunstfertigkeit ... aber das ist doch Codegolf. ;)
DLosc
@ DLosc, nach allem, was ich gesehen habe, verbietet es Ihnen nichts, dies zu tun. Also ... du bist ein besserer Golfer als ich ^ _ ^
Rodolfo Dias
1
Hm. Rufen Sie Robert Fraser nicht wahnsinnig an. codegolf.stackexchange.com/a/69360/43394
wizzwizz4
12

Jede römische Ziffer ist eine gültige Szenennummer

Das heißt, dass anstelle von:

Scene I
Scene II
Scene III
Scene IV
Scene V

Du kannst tun:

Scene L
Scene I
Scene C
Scene X
Scene V
NieDzejkob
quelle
ist Deine gültige römische Ziffer? IIRC, es ist 500 (aber ich bin nicht sicher, ob es in SPL gültig ist)
Giuseppe
@ Giuseppe Ich verstehe nicht, warum Sie das nicht einfach überprüfen, aber der offizielle SPL-Interpreter unterstützt M, C, D, X, L, I und V.
NieDzejkob
10

Entfernen Sie nicht benötigte Wörter

Sehen Sie sich das an (Einfügen von Zeilenumbrüchen und Leerzeichen zur besseren Lesbarkeit):

Puck:You is a big big cat!
     Open your heart!
Ajax:Be you worse than I?
     If so, let us return to Scene V!
     If not, you is a cat.
     You is the sum of I and the sum of a cat and you
     Speak thy mind!
     [Exeunt]

Sieht ziemlich gut aus, oder? Hier ist eine noch weniger verständliche Form:

Puck:You big big cat!
     Open heart!
Ajax:Be you worse I?
     If so, let us Scene V!
     If not, you cat.
     You is the sum of I the sum of a cat you
     Speak mind!

Als Referenz finden Sie hier eine Liste von Wörtern, die sich leicht aus dem Code entfernen lassen:

  • Sprechen Sie Ihre Meinung -> Sprechen Sie Ihre
  • Öffne dein Herz -> Öffne dein Herz *
  • Hör auf dein Herz -> Hör auf dich
  • Öffne deinen Geist -> Öffne deinen Geist *
  • Du bist eine Katze -> Du Katze *
    • Gilt nur für Konstanten wie big cat, sonst brauchst du noch das 'is'
  • Kehren wir zurück zu -> Lass uns
  • Sei X [op] als Y? -> Sei X [op] Y?
  • Du bist [op] von X und Y -> Du bist [op] von X Y
  • [Exeunt] -> (komplett entfernt)

Legende:

  • Xund Ysind Konstanten wie cat, Ioderyou
  • [op]sind Operationen wie nicer,the sum of
  • * bedeutet, dass Sie die Interpunktion entfernen können, wenn es der letzte Satz des Spiels ist

Wenn ich auf andere stoße, füge ich sie der Liste hinzu.

Als zusätzliche Referenz ist hier die kürzeste Überschrift, um ein Programm zu starten:

,.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]

Probieren Sie es online!

Fügen Sie nach Bedarf Page und Ford als zusätzliche Zeichen hinzu.

Scherzen
quelle
1
Wenn du noch mehr Charaktere brauchst, gibt es hier
NieDzejkob
: | gestreift
ASCII
6

Verwenden Sie kurze Wörter

Also hier sind sie:

  • Verwenden Sie aanstelle von anoder the, mit Ausnahme von Ausdrücken the sum ofund Ähnlichem, da diese nicht funktionieren a.
  • Verwendung am, beoder isanstelle von areoder art.
  • Verwenden Sie Ianstelle von meoder myself.
  • Verwenden Sie youanstelle von thee, thou, thyselfoder yourself.
  • Verwenden Sie bigfür Adjektive.
  • Verwenden Sie catfür positive Zahlen.
  • Verwenden Sie pigfür negative Zahlen.
  • Verwenden Sie zerofür Null.
  • Verwenden Sie worsefür A < B(anstelle von smalleroder punier).
  • Verwenden Sie nicerfür A > B(statt better, bigger, fresher, friendlieroder jollier).
  • Charakternamen:
    • 4 Buchstaben: Ajax, Ford, Page, Puck
    • 5 Buchstaben: Egeus, Helen, Julia, Lucio, Mopsa, Paris, Prise, Priamos, Regan, Robin, Romeo, Timon, Titus, Venus, Bratsche
    • 6 Buchstaben: Adonis, Aegeon, Alonso, Angelo, Arthur, Banquo, Bianca, Brutus, Cicero, Dorcas, Duncan, Emilia, Fenton, Weiler, Hecate, Hector, Helena, Hermia, Imogen, Julia, Lennox, Oberon, Olivia, Orsino , Portia, Thaisa, Thurio, Tybalt
    • 7 Buchstaben: Adriana, Aemilia, Agrippa, Antonio, Capulet, Cassius, Claudio, Dionyza, Escalus, Goneril, Horatio, Leonato, Luciana, Macbeth, Macduff, Malcolm, Mariana, Miranda, Octavia, Ophelia, Orlando, Othello, Pantino, Proteus , Publius, Shallow, Shylock, Slender, Solinus, Theseus, Titania, Troilus, Ulysses
    • Acht Buchstaben: Achilles, Beatrice, Benedikt, Benvolio, Claudius, Cordelia, Cressida, Dogberry, Don John, Falstaff, Gertrude, Hermonie, Isabella, Lysander, Mercutio, Montague, Perikles, Polonius, Pompeius, Prospero, Rosalind, Stephano
    • 9 Buchstaben: Agamemnon, Antiochus, Autolycus, Balthasar, Brabantio, Kassandra, Kleopatra, Cornelius, Demetrius, Desdemona, Donalbain, Don Pedro, Ferdinand, Franziska, Hippolyta, König Johannes, König Lear, Lychorida, Sebastian, Der Geist, Valentin, Vincentio
    • 10 Buchstaben: Andromache, Cymberline, Fortinbras, Bruder John, König Henry
    • 11 Buchstaben: Mark Anton
    • 12 Briefe: Doktor Caius, König Richard, Dame Capulet, Dame Macbeth, Dame Macduff, Prinz Henry, Königin Elinor
    • 13 Briefe: John of Gaunt, Julius Caesar, Lady Montague, Herrin Ford, Herrin Page
    • 14 Briefe: Bruder Laurence, der Apotheker
    • 15 Briefe: Christopher Sly, Octavius ​​Caesar
    • 17 Briefe: John of Lancaster, Mistress Overdone, Der Herzog von Mailand
    • 18 Briefe: Der Herzog von Venedig
    • 24 Briefe: Der Abt von Westminster
    • 28 Briefe: Der Erzbischof von Canterbury
    • Wenn Sie wirklich mehr brauchen, sollten Sie auf jeden Fall in Betracht ziehen, den Stapel der einzelnen Zeichen zu verwenden.
NieDzejkob
quelle
Beachten Sie, dass Zeichen mit mehreren Wörtern keine Leerzeichen nach ihrem Namen enthalten dürfen (aus dem Tipp von user202729 ). Daher sind sie Zeichen mit nur einem Wort vorzuziehen
Jo King
5

Die Option "Kehren wir zu Szene X zurück" kann auch verwendet werden, wenn der Charakter, mit dem gesprochen wird, nicht auf der Bühne steht. Also statt:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
Ajax:If not,let us return to scene III.
[Exit Puck]
[Enter Page]
Ajax:You is a big big big big big big cat.

Du kannst tun:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
[Exit Puck]
[Enter Page]
Ajax:If not,let us return to scene III.You is a big big big big big big cat.
Robert Fraser
quelle
5

Entfernen Sie überflüssige Leerzeichen

Abgesehen von den trivialen (zwei benachbarte Leerzeichen neben einer Interpunktion neben einer neuen Zeile am Ende) (mit einigen Ausnahmen) kann das Leerzeichen nach den folgenden Token entfernt werden:

  • the sum of
  • let us
  • the ghost( wie folgt ) (aber wer würde diesen Charakter sowieso benutzen)
  • if sound if not(Entfernen des ,nach diesem, und benötigen keinen Raum hinzufügen . Beispiel: if solet usact I)
  • listen to(so listen tothyfunktioniert das )
  • und im Grunde alle Multi-Word- Token .

Hinweis: Dies funktioniert nicht mit dem Perl-Interpreter . Es handelt sich wahrscheinlich nur um einen unbeabsichtigten Effekt, der durch das Parsing-Verhalten von Flex verursacht wird. Der "Sprachstandard" ist darüber nicht klar.

user202729
quelle
Zeit, einige meiner Antworten zu bearbeiten ... Sehr schöne Entdeckung!
Jo King
Ist das ein Fehler im Tokenizer oder ist dieses Verhalten in der Sprache definiert?
Cœur
2
@ Cœur Siehe Update.
user202729
5

Sie müssen nicht die Mitarbeiter wechseln.

Zum Beispiel,

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?
Puck:If so,let us return to Scene I.

ist länger als

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?If so,let us return to Scene I.
Oliver Ni
quelle
1
Hoppla. Festsetzung.
Oliver Ni
4

Anstatt zu subtrahieren, fügen Sie Konstanten hinzu

You is the difference between I and a big cat.

ist länger als

You is the sum of I and a big pig.
NieDzejkob
quelle
4

Sprünge können kürzer sein

Sie können auch verwenden return to, wenn die Szene voraus ist, und umgekehrt. In der Tat ist es dem Dolmetscher egal, ob Sie es ganz weglassen. Dies bedeutet, dass diese drei Aussagen zu 100% äquivalent sind:

Let us proceed to Scene X.
Let us return to Scene X.
Let us Scene X.
NieDzejkob
quelle
Jo King ( codegolf.stackexchange.com/a/164394/76162 ) hat festgestellt, dass "Let us Scene X" ausreicht.
Ed Wynn
@ EdWynn gut zu wissen. Ich habe die Antwort umgeschrieben, um dies aufzunehmen.
NieDzejkob
6
Let usscene Xist genug .
user202729
4

Verwenden Sie nur eine Szene

Normalerweise kann man die erste Szene eines Acts nicht wiederverwenden, da sie immer das [Enter Ajax and Puck]Erste ist. Sie können dies jedoch mit einem Vorwort versehen [Exeunt], um die erste Szene eines Stücks wiederzuverwenden. [Exeunt]ist ein Byte kürzer als das Deklarieren einer neuen Szene, und das Springen zu einem Act ist zwei Bytes kürzer als das Springen zu einer Szene.

ZB: Ein einfaches Katzenprogramm

,.Ajax,.Page,.Act I:.Scene I:.[Enter Page and Ajax]Scene V:.Ajax:Open mind!Speak thy!Let usScene V!

Probieren Sie es online!

Zu:

,.Ajax,.Page,.Act I:.Scene I:.[Exeunt][Enter Page and Ajax]Ajax:Open mind!Speak thy!Let usAct I!

Probieren Sie es online!

Scherzen
quelle
3

Verwenden Sie kürzere Wörter

Beispiele:

Thyund thyselfsind kürzer als yourund yourself.

Isist kürzer als are.

und mehr...

Oliver Ni
quelle
3

Verwenden Sie intelligente Bedingungen

Zum Beispiel nicht verwenden

Ajax:Are you as good as or better than me?If so,let us return to Scene I.

Sondern

Ajax:Are you worse than me?If not,let us return to Scene I.
Oliver Ni
quelle
3

If (so|not) muss dem Vergleich nicht sofort folgen.

Am I as big as you?You big big big big big cat.If so, you is the sum of you and a big big cat.
NieDzejkob
quelle
4
Tatsächlich werden die Ergebnisse eines Vergleichs als Flag gespeichert und können wiederholt über Szenenübergänge oder über mehrere If sos hinweg verwendet werden. Dies kann hilfreich sein, um wiederholte Vergleiche zu vermeiden!
Jo King
2

Verwenden Sie Konstanten, um große Zahlen zu speichern

Zum Beispiel, wenn Sie haben

Ajax:You is a fat fat fat fat fat fat fat fat fat fat cat!
Puck:You is the sum of thyself and a fat fat fat fat fat fat fat fat fat fat cat
Ajax:You is the sum of the difference of me and thyself and a fat fat fat fat fat fat fat fat fat fat cat!

Sie können einfach eine andere Person an der Spitze deklarieren

Ford,a fat fat fat fat fat fat fat fat fat fat cat.

und ändern Sie Ihren Code in

Ajax:You is Ford.
Puck:You is the sum of thyself and Ford.
Ajax:You is the sum of the difference of me and thyself and Ford.
Oliver Ni
quelle
8
Der offizielle Interpreter unterstützt die Deklaration solcher Konstanten nicht.
NieDzejkob
2

Gotos sind nicht die einzigen Befehle, die verwendet werden können If (so|not)

Am I as big as you?If so,you is the sum of you and a big big cat.If not,you is the sum of you and twice I.
NieDzejkob
quelle
2

Alle Zeilenumbrüche werden ignoriert

,.Ajax,.Puck,.Page,.Act:.Scene:.[Enter Ajax and Puck]Ajax:You Puck.[Exeunt]
NieDzejkob
quelle
2

Verwenden Sie <oder >anstelle von==

Nicht in jeder Situation anwendbar, aber etwas kürzer:

Puck == Ajax

Puck:Is I as bad as you?

Puck <Ajax oder Puck> Ajax

Puck:Is I worse you?
Puck:Is I nicer you?

4 Bytes kürzer für beide!

Scherzen
quelle
2

Du brauchst das Ende .oder nicht !.

Probieren Sie es online!

Dies kann auch vor a [. (danke jimmy23013)

,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat[Exeunt]

Beispiele:

  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Open mind[Exeunt]

Funktioniert nicht in:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](gleich danach Scene {number}:) (aber das funktioniert, ich weiß nicht warum)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (und kürzere Varianten)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (und kürzere Varianten)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(nur nachdem leer Recall, Recall xoder Recall@etc. funktioniert)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(ohne mind)
user202729
quelle
Dies funktioniert nicht in Situationen, in denen Sie bereits ein Wort entfernt haben, z. B. Speak thyoderLet us Scene I
Jo King
2

Verwenden Sie "zweimal" und die Distributiveigenschaft

Anstatt von:

You is the sum of a big big big big cat a big big big cat.

Verwenden:

You is twice twice twice the sum of a big cat a cat.

Dies spart 2 Bytes pro, twiceda 2 Verwendungen von big8 Bytes (mit einem Leerzeichen) und twicenur 6 Bytes sind.

hallo Auf Wiedersehen
quelle