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.
Antworten:
(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.
quelle
(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.
und
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 Code-Golf- Herausforderung teilnehmen kann, also ...
quelle
a big big big big big big cat
, Speicher 4 weiteres Bytes? Ich weiß, es ruiniert die Kunstfertigkeit ... aber das ist doch Codegolf. ;)Jede römische Ziffer ist eine gültige Szenennummer
Das heißt, dass anstelle von:
Du kannst tun:
quelle
D
eine gültige römische Ziffer? IIRC, es ist 500 (aber ich bin nicht sicher, ob es in SPL gültig ist)Entfernen Sie nicht benötigte Wörter
Sehen Sie sich das an (Einfügen von Zeilenumbrüchen und Leerzeichen zur besseren Lesbarkeit):
Sieht ziemlich gut aus, oder? Hier ist eine noch weniger verständliche Form:
Als Referenz finden Sie hier eine Liste von Wörtern, die sich leicht aus dem Code entfernen lassen:
big cat
, sonst brauchst du noch das 'is'Legende:
X
undY
sind Konstanten wiecat
,I
oderyou
[op]
sind Operationen wienicer
,the sum of
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:
Probieren Sie es online!
Fügen Sie nach Bedarf Page und Ford als zusätzliche Zeichen hinzu.
quelle
Verwenden Sie kurze Wörter
Also hier sind sie:
a
anstelle vonan
oderthe
, mit Ausnahme von Ausdrückenthe sum of
und Ähnlichem, da diese nicht funktionierena
.am
,be
oderis
anstelle vonare
oderart
.I
anstelle vonme
odermyself
.you
anstelle vonthee
,thou
,thyself
oderyourself
.big
für Adjektive.cat
für positive Zahlen.pig
für negative Zahlen.zero
für Null.worse
fürA < B
(anstelle vonsmaller
oderpunier
).nicer
fürA > B
(stattbetter
,bigger
,fresher
,friendlier
oderjollier
).quelle
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:
Du kannst tun:
quelle
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 so
undif not
(Entfernen des,
nach diesem, und benötigen keinen Raum hinzufügen . Beispiel:if solet usact I
)listen to
(solisten tothy
funktioniert das )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.
quelle
Sie müssen nicht die Mitarbeiter wechseln.
Zum Beispiel,
ist länger als
quelle
Anstatt zu subtrahieren, fügen Sie Konstanten hinzu
ist länger als
quelle
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:quelle
Let usscene X
ist genug .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
Probieren Sie es online!
Zu:
Probieren Sie es online!
quelle
Verwenden Sie kürzere Wörter
Beispiele:
Thy
undthyself
sind kürzer alsyour
undyourself
.Is
ist kürzer alsare
.und mehr...
quelle
Verwenden Sie intelligente Bedingungen
Zum Beispiel nicht verwenden
Sondern
quelle
If (so|not)
muss dem Vergleich nicht sofort folgen.quelle
If so
s hinweg verwendet werden. Dies kann hilfreich sein, um wiederholte Vergleiche zu vermeiden!Verwenden Sie Konstanten, um große Zahlen zu speichern
Zum Beispiel, wenn Sie haben
Sie können einfach eine andere Person an der Spitze deklarieren
und ändern Sie Ihren Code in
quelle
Gotos sind nicht die einzigen Befehle, die verwendet werden können
If (so|not)
quelle
Alle Zeilenumbrüche werden ignoriert
quelle
Verwenden Sie
<
oder>
anstelle von==
Nicht in jeder Situation anwendbar, aber etwas kürzer:
Puck == Ajax
Puck <Ajax oder Puck> Ajax
4 Bytes kürzer für beide!
quelle
Du brauchst das Ende
.
oder nicht!
.Probieren Sie es online!
Dies kann auch vor a
[
. (danke jimmy23013)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 danachScene {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 leerRecall
,Recall x
oderRecall@
etc. funktioniert),.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy
(ohnemind
)quelle
Speak thy
oderLet us Scene I
Verwenden Sie "zweimal" und die Distributiveigenschaft
Anstatt von:
Verwenden:
Dies spart 2 Bytes pro,
twice
da 2 Verwendungen vonbig
8 Bytes (mit einem Leerzeichen) undtwice
nur 6 Bytes sind.quelle