Welche allgemeinen Tipps haben Sie zum Golfen in Befunge? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme im Allgemeinen anwenden lassen, die zumindest etwas spezifisch für Befunge sind (z. B. "Kommentare entfernen" ist keine Antwort). Bitte posten Sie einen Tipp pro Antwort.
12
Antworten:
Versuchen Sie bei Verwendung einer mehrzeiligen Schleife, so viel wie möglich davon zu verwenden:
vs
quelle
Müssen Sie einen Wert nach einer Bedingung löschen (z. B. weil der andere Pfad vom Wert abhängt, dieser jedoch nicht)? Anstatt
>$
oder zu verwenden$<
, sollten Sie davon ausgehen, dass Sie den Wahrheitswert der Variablen kennen, und_
stattdessen Richtung und Popstack ändern.Beispiel
wird verwandelt in
quelle
Vergiss nicht, dass
0
das immer auf dem Stapel ist. Dies bedeutet zum Beispiel, dass mit einem leeren Stapelg
gleichbedeutend ist mit00g
undp
gleichbedeutend ist mit000p
.quelle
Wenn Sie eine Zahl größer als 15 eingeben müssen
'
, rufen Sie mit den ASCII-Wert des nächsten Zeichens ab:42 drücken anstatt:
quelle
67*
funktioniert auch'
Befehl nicht unterstützt .Verwenden Sie stattdessen
|
eine andere Zeile (häufig mit vielen zusätzlichen Leerzeichen)j
. Beispielsweise:würde aufhören, wenn die Zahl oben auf dem Stapel negativ wäre, und ansonsten weitermachen. Wenn Sie mehrere Zeichen benötigen, geben Sie
n*j
an,n
wie viele Zeichen Sie benötigen, wenn der übergebene Wertj
lautet0
. Beispiel:das würde eine negative Zahl negieren.
quelle
j
Befehl nicht unterstützt .Wenn Sie in Befunge-93 als Erstes eine Zeichenfolge auf den Stapel legen, kann es häufig passieren, dass Sie das Eröffnungszitat fallen lassen. Zum Beispiel das:
könnte dazu vereinfacht werden:
Probieren Sie es online!
Was passiert, ist, dass der Interpreter zuerst versucht, die Zeichen in der Zeichenfolge ohne Anführungszeichen auszuführen. Die
!
führt eine harmlose nicht , und diei
undH
sind keine gültigen Anweisungen, so dass sie ignoriert werden (obwohl bei einigen Implementierungen möglicherweise eine Warnung angezeigt wird).Wenn das
"
angetroffen wird, wird dies als der Anfang der Zeichenfolge betrachtet. Da jedoch kein abschließendes Anführungszeichen vorhanden ist, wird das Feld vollständig umbrochen, bis"
es ein zweites Mal angetroffen wird. Was dann auf den Stapel geschoben wird, ist folgendes:Da wir uns nur um die letzten Charaktere kümmern, ist nichts anderes von Bedeutung. Nach dem Zitat können wir dann endlich die drei
,
Befehle ausführen , die Nachricht ausschreiben und den@
Befehl, der beendet wird.Beachten Sie, dass dies in Befunge-98 normalerweise nicht funktioniert, da eine nicht erkannte Anweisung den Interpreter zum Reflektieren veranlasst, anstatt ihn zu ignorieren.
quelle
",,,@!iH
. Beachten Sie, dass Pyfunge ein zusätzliches Leerzeichen hinzufügt, während FBBI dies nicht tut.In Befunge-93 kann es oft vorteilhaft sein, eine Schleife in eine einzige Zeile zu reduzieren, wobei der Schleifenabschnitt des Codes in beide Richtungen ausgeführt wird.
Betrachten Sie beispielsweise den folgenden Code, der den Buchstaben
a
achtmal ausgibt :Dies kann zu einer einzelnen Zeile reduziert werden, indem die Schleifensequenz mit Brückenbefehlen (
#
) durchsetzt wird:Probieren Sie es online!
Wenn Sie sich nur die Zeichen ohne Leerzeichen ansehen, haben Sie möglicherweise den Eindruck, dass diese länger sind als das Original. Wenn Sie jedoch den Zeilenvorschub und den zusätzlichen Abstand berücksichtigen, der in der zweizeiligen Version erforderlich ist, sparen Sie tatsächlich vier Bytes.
In diesem speziellen Fall kann der Code noch weiter komprimiert werden, indem festgestellt wird, dass diese Sequenz
:#:
einfach durch ersetzt werden kann:
.Probieren Sie es online!
Tatsächlich können Sie jedes Mal, wenn Sie denselben Befehl auf beiden Seiten eines
#
Befehls wiederholen, diesen auf den einen Befehl vereinfachen. Dies ist also etwas, worauf Sie beim Reduzieren einer Schleife immer achten sollten.Um zu verstehen, wie dies funktioniert, kann es hilfreich sein, die Schleifenfolge zweimal zu schreiben, einmal mit allen Zeichen nach dem
#
Entfernen (dh was passiert, wenn von links nach rechts ausgeführt wird) und einmal mit den Zeichen vor dem#
Entfernen (dh von rechts nach links ausgeführt wird) ).Sie können jetzt deutlich sehen, wie dies mit der ursprünglichen zweizeiligen Version des Codes übereinstimmt.
quelle
Ausgabe über Exit-Code, wobei dies ein zulässiges Ausgabeformular ist. Wenn Sie aufgefordert werden, eine Nummer auszudrucken, können Sie ein Byte speichern, indem Sie das Programm mit
q
anstelle von beenden.@
quelle
q
Befehl eine andere Funktion (Warteschlangenmodus) oder wurde nicht unterstützt.In Befunge-93 kann der Zeicheneingabebefehl (
~
) häufig als Abkürzung für -1 verwendet werden, da dies der Wert ist, der bei EOF zurückgegeben wird.Der folgende Code gibt beispielsweise -1 aus:
Probieren Sie es online!
Dies wird im Produktionscode nicht empfohlen, da das Programm beim Ausführen in einer interaktiven Umgebung anhält und auf Benutzereingaben wartet. Und wenn der Benutzer etwas eingibt, ist das Ergebnis natürlich nicht mehr -1.
Die Regel für PPCG lautet jedoch, dass ein Programm möglicherweise einen leeren Eingabestream annimmt , und so würde es normalerweise auf TIO ausgeführt .
Beachten Sie auch, dass Sie nicht unbedingt daran gehindert sind, diesen Trick zu verwenden, nur weil Ihr Programm etwas aus dem Eingabestream lesen muss. Sie müssen nur sicherstellen, dass Sie Ihre Eingaben vorab verarbeiten. Danach
~
sollten alle zukünftigen Verwendungen von -1 zurückgeben.quelle
Verwenden Sie beim Umgang mit
_
oder die Richtung der IP|
, anstatt ein zusätzliches Zeichen für zu verwenden!
.Echtes Beispiel (aus diesem Beitrag ):
Kann geändert werden zu
quelle
Vergiss nicht, dass
0k
der nächste Befehl nicht ausgeführt wird. Dies bedeutet, dass anstatt zu tun:Sie können einen Charakter speichern, indem Sie tun
quelle
k
Anweisung nicht unterstützt .Vergessen Sie nicht den
k
Bediener. Anstatt zu"!dlroW olleH",,,,,,,,,,,,@
tun"!dlroW olleH"bk,@
. Beachten Sie, dassk
die Operation funktioniert auf der Zelle , dass sie an ist , so9k,
würde nicht gedruckt 9mal aber 10; 9 mal mitk
und einmal mit,
.quelle
k
Anweisung nicht unterstützt .Wenn Sie kleine Zahlen auf den Stapel schieben, können Sie wahrscheinlich leicht genug herausfinden, dass
45*
Sie20
und bekommen67*
Sie erhalten42
. Bei größeren Zahlen benötigen Sie jedoch ein Programm, mit dem Sie die effizienteste Darstellung berechnen können.Die einfachste Möglichkeit hierfür ist die Online-Oberfläche von Mike Schwörer für BefunRep . Sie geben einfach eine Zahl ein und es wird eine äquivalente Befunge-Darstellung ausgespuckt. Es ist nicht immer das Optimalste, aber es ist nah genug, und es ist mit ziemlicher Sicherheit besser als alles, was man sich mit der Hand einfallen lässt.
Das Online-System ist auf Zahlen im Bereich von 0 bis 16777215 beschränkt. Wenn Sie also etwas Größeres benötigen, sollten Sie das eigenständige BefunRep-Dienstprogramm herunterladen und die Berechnungen selbst ausführen.
Wenn Sie in Befunge-98 programmieren, sollten Sie auch Fungify in Betracht ziehen . Im Allgemeinen ist es nicht annähernd so optimal wie BefunRep, aber für einige der niedrigeren Zahlen, bei denen Hexadezimalziffern und einfache Anführungszeichen am effektivsten sind, können manchmal bessere Ergebnisse erzielt werden.
quelle
'
. ZB für42
:'*