Tipps zum Golfen im Leerraum

14

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

Bitte posten Sie einen Tipp pro Antwort.

Loovjo
quelle
80
Entfernen Sie unnötige Leerzeichen.
KSFT
1
s / [^ [: space:]] // g
Digitales Trauma

Antworten:

11

Ich bin mir nicht ganz sicher, ob dies eine Scherzfrage ist oder nicht, also hoffe ich, dass ich mich nicht darüber lustig machen lasse, dass ich es ernst nehme, aber ...

Tipp 1: Beenden Sie Ihr Programm nicht

Die Spezifikation besagt, dass ein Programm durch drei Zeilenvorschübe beendet werden sollte [LF][LF][LF], wobei der erste der IMP für die Flusskontrolle und die nächsten beiden der Befehl quit sind. Viele Interpreter führen jedoch nur Ihren Code ohne die richtige Beendigung aus. Speichert Sie 3 Zeichen in einem Programm.

theonlygusti
quelle
6

Tipp 2: Verwenden Sie den Haufen so wenig wie möglich

Früher habe ich den Heap häufig zum Zählen meiner Loops und dergleichen verwendet, aber mir wurde klar, dass er tatsächlich äußerst ineffizient war. Erstes Drücken einer Adresse, Abrufen des aktuellen Zählwerts, Hinzufügen einer Adresse, erneutes Drücken der Adresse usw.

Jetzt drücke ich einfach einen Wert auf den Stack, um als Schleifenzähler zu fungieren, und verwende dann den [Space][LF][Tab]Swap-Befehl, um zu ihm zurückzukehren, wenn ich ihn brauche. Es erfordert viel Arbeit in / um, aber wenn Sie es bekommen, kann es Ihre Zeichenanzahl wirklich reduzieren.

theonlygusti
quelle
5

Verwenden Sie beliebige Heap-Adressen

Viele Interpreter ermöglichen das Lesen / Schreiben an beliebige Heap-Adressen, anstatt bei 0 oder 1 zu beginnen und hochzuzählen. Sie können einen vorhandenen Stapelwert (3 Byte) duplizieren, um ihn als Adresse zu verwenden, anstatt einen neuen Wert zu übergeben (mindestens 4 Byte).

Ephphatha
quelle
+1. Beachten Sie, dass dies nur für nicht negative Heap-Adressen gilt. Wenn die Spitze des Stapels also eine negative Ganzzahl ist, können Sie sie nicht als Heap-Adresse verwenden.
Kevin Cruijssen
5

Senken Sie alle Zeichen um einen festen Betrag und fügen Sie diesen unmittelbar vor dem Drucken in einer Schleife hinzu

Dank an @LukStorms , der in seiner Antwort auf die Hello World-Herausforderung einen ähnlichen Ansatz verwendet .

( STNWird für Leerzeichen, Tabulator und neue Zeile verwendet.)

Das Verschieben der Werte für Buchstaben beträgt immer 11 Bytes (dh das Verschieben des Wertes 65 für das Zeichen 'A' ist SSSTSSSSSTN; das Verschieben des Wertes 122 für das Zeichen 'z' ist SSSTTTTSTSN). Wenn Sie große Textmengen ausgeben möchten, kann dies teuer werden. Stattdessen können Sie die Werte aller Zeichen, die Sie drucken möchten, um einen festen Betrag verringern und dann in der Schleife zum Drucken diesen festen Betrag hinzufügen.

Dies kann mit dem folgenden Code geschehen (nehmen wir an, der feste Wert ist in diesem Fall 100):

  1. Schieben Sie alle Werte für die Zeichen (abzüglich des festen Betrags 100) in umgekehrter Reihenfolge
  2. NSSN (Erstelle ein Label_0; starte im Grunde die Schleife)
    1. SSSTTSSTSSN (Schieben Sie den festen Betrag 100)
    2. TSSS (Addiere die beiden obersten Werte des Stapels)
    3. TNSS (Pop und print den jetzt korrekten Wert als Zeichen)
    4. NSNN (Springe zu Label_0; gehe zur nächsten Iteration der Schleife)

Dies stoppt das Programm mit einem Fehler ( der laut Meta zulässig ist ), sobald es versucht, das Add ( TSSS) mit nichts mehr auf dem Stapel auszuführen. Ich habe das benutzt, um diese Antwort von mir zu spielen (siehe Punkte 5 und 6 von Dinge, die ich getan habe, um die Byteanzahl zu senken ).

Ob eine feste Menge von 100 der kürzeste Weg ist, hängt davon ab, was Sie drucken. @LukStorm verwendete zum Beispiel 107 in seiner Hello World-Antwort.

Beachten Sie, dass das Kopieren des Top-Werts ( SNS) für zwei gleiche benachbarte Zeichen (wie das lIn Hello) oder das Kopieren von Werten von einer anderen Position weiterhin verwendet werden kann, um mehr Bytes zu erfassen.

Kevin Cruijssen
quelle
4

Das Springen zu undefinierten Labels beendet das Programm (in einigen Interpreten)

Dies fängt an, ein implementierungsspezifisches Verhalten zu entwickeln, aber ich glaube, dass dies zulässig ist .

TIO (und möglicherweise auch andere Interpreten? Arbeiten zumindest nicht mit ideone) stoppen die Ausführung, wenn versucht wird, zu einem Label zu springen, das nicht existiert. Wenn Sie einen Vergleich durchführen müssen, um aus einer Schleife auszubrechen, können Sie Bytes sparen, indem Sie das break-Label nicht deklarieren. ( Ein Beispiel finden Sie in meinem Kommentar zu Print Invisible Text .)

Ephphatha
quelle
4

Der Wert 0 kann als Zahl ohne Binärziffern deklariert werden

In diesem Tutorial wird erwähnt, dass Zahlen eine beliebige Anzahl von Bits / Binärziffern sein können. Dies bedeutet, dass eine Zahl ohne Bits (jenseits des erforderlichen Vorzeichenbits) eine gültige Darstellung des Werts 0 ist [Space][Space][Space][LF]und [Space][Space][Space][Space][LF]beide den Wert 0 an den Stapel senden, ersterer ist jedoch ein Byte kürzer.

Ephphatha
quelle
0

Das Kopieren früherer Ganzzahlen kann kürzer sein als das Erstellen neuer

( STNWird für Leerzeichen, Tabulator und neue Zeile verwendet.)

STSDas Argument + Number kann verwendet werden, um das n- te Element auf dem Stapel (das durch das Argument angegeben wird) oben auf den Stapel zu kopieren . Dies kann in einigen Fällen zum Speichern von Bytes verwendet werden.

In meiner Antwort habe ich zum Beispiel im vierten Teil erklärt, wie ich die Byteanzahl senken kann, wenn das Kopieren des ersten (0-indizierten) Werts ( STSSTN) kürzer ist als das Drücken von 12, um das Zeichen 'p' ( SSSTTSSN) zu erzeugen. im Teil "pop"der Ausgabe. (HINWEIS: Ich verwende den Wert 12 anstelle von 112 für das Zeichen 'p', da ich diesen anderen Tipp angewendet habe , um alle Werte um einen festen Betrag zu senken, den wir vor dem Drucken der Zeichen in der Schleife hinzufügen .)

Kevin Cruijssen
quelle