Tipps zum Golfen in> <> (Fisch)

14

Da ich in letzter Zeit mehr > <> Einreichungen gesehen habe, hielt ich es für eine gute Idee, eine Seite mit Tipps zu haben.

Bitte halte dich an einen Tipp pro Post, es sei denn, diese hängen eng zusammen.

Offizieller Python-Interpreter

Online-Dolmetscher (einige Fehler vorhanden, aber in den meisten Fällen gut)

Sp3000
quelle
9
Mir ist gerade auf der Esolang-Seite aufgefallen, dass der Schöpfer von> <> einen Namen hat, der wie "Harpune" klingt.
mbomb007
Wie kann ich eine neue Zeile in Fisch drucken?
Captain Man
@CaptainMan Sie können Codepunkte mit ausgeben o, und da Newline \nASCII 10 ist, können Sie dies tun ao.
Sp3000,
@Sp danke, ich habe versucht , CRstatt LFund schob dstatt a.
Captain Man

Antworten:

5

Überprüfung gegen 0

Mit ?!anstelle von wird 0=?normalerweise ein Byte gespeichert.

?Manchmal ist jedoch nur ein Standard besser, wenn Sie sich eine gewisse Umstrukturierung leisten können

?!vA
  B

gegen

?vB
 A
Sp3000
quelle
4

Überprüfung auf EOF

Wenn EOF erreicht ist, schiebt> <> ein -1 auf den Stapel, was auf zwei Arten überprüft werden kann:

:0(?
:1+?

Bei der Überprüfung auf EOF handelt es sich um Negationen. Welche davon vorteilhafter ist, hängt von der Struktur Ihres Programms ab.

Sp3000
quelle
3

Springe, um neue Zeilen zu umgehen

Wenn Sie eine neue Zeile beginnen, bedeutet dies manchmal, dass Sie in der nächsten Zeile viel führenden Leerraum verschwenden. In einer solchen Situation kann das Springen nützlich sein.

Zum Beispiel,

[lots of code here]>[loop body]v
                   ^ ......... <

kann so gemacht werden, dass es in eine Zeile passt:

[lots of code here][loop body][jump]

Als praktisches Beispiel ist hier das Hello World-Programm in einer Zeile:

"!dlroW ,olleH"l?!;oe0.
Sp3000
quelle
3

Verwenden des Moduls zur Vereinfachung der Eingabe

Dies könnte ein zu einfacher Tipp sein. Wenn dies der Fall ist, ersetze ich ihn einfach oder lösche ihn.

Angenommen, Sie möchten zwei Zeichen eingeben, "a" und "b", und jeweils 1 und 2 zurückgeben. Sie würden hierfür wahrscheinlich Bedingungen verwenden, da dies am sinnvollsten ist, und ich werde für dieses spezielle Beispiel eine komprimiertere Form verwenden.

i:"a")+1+n

Dies prüft, ob die Eingabe größer als "a" ist und addiert 1. Da "a" 0 und "b" 1 zurückgibt, ergibt dies 1 und 2. Dies erledigt den Job ziemlich gut, aber im Fall von unserem eingaben könnten wir noch weiter gehen.

i:3%n

In Mod 3 wird 97, was das numerische Äquivalent von "a" ist, zu 1 und 98, was das Äquivalent von "b" ist, zu 2. Für zwei verschiedene Zahlen ist ein Mod garantiert, der für beide eindeutige Ergebnisse liefert. Für mehr als zwei gibt es einen Mod, der eindeutige Ergebnisse liefert, aber ich habe nicht die mathematische Fähigkeit, den kleinsten auf einfache Weise zu finden (z. B. wenn Sie die Menge {100,101,102,103} haben, würde Mod 104 eindeutige Ergebnisse für liefern jeder Wert drin, aber nicht sehr hilfreich). In den meisten Fällen kann man jedoch einen Mod finden, der funktioniert, wenn die Eingabe auf ein paar alphabetische Zeichen beschränkt ist.

Um den kleinsten Modul zu finden, der eindeutige Ergebnisse für die beiden Zahlen a und b liefert, gehen Sie wie folgt vor. Nimm den absoluten Wert der Differenz von a und b ( |a - b|) und finde die kleinste Zahl n, die sie nicht teilt. zB für 97 und 98, |98 - 97| = 1und so wäre 2 der kleinste Mod (aber für unser Testprogramm ergibt dies 1 für 97 und 0 für 98, also ist Mod 3 besser).

cole
quelle
3

Sprünge als Bedingung verwenden

Manchmal werden Sie Programme in> <> schreiben, bei denen Sie nach Erhalt verschiedener Eingaben unterschiedliche Aktionen ausführen müssen. Normalerweise verwenden Sie conditionals ( ?) und direction changers, um dies zu analysieren. In einigen Fällen funktioniert dies problemlos (insbesondere, wenn weniger Eingabetypen verarbeitet werden müssen), aber manchmal sieht es auch so aus. (Ignorieren Sie die Tatsache, dass dieser Code mit einigen anderen Tricks reduziert werden kann. Er dient nur zu Demonstrationszwecken.)

i:"a"=?v:"b"=?v"c"=?v>
  .00n1< .00n2<.00n3<

Dies ist zwar in Ordnung, hat jedoch einige Leerzeichen (die ich persönlich nie gerne sehe) und es gibt viele Wiederholungen ( =?vund .00n). Stattdessen können Sie einen Sprung und verschiedene Zeilen als Bedingung verwenden. Hier ist ein Beispiel:

i:"a")$"b")+1+0$.>
v1
v2
v3
<.00n

Das spart 10 Bytes. Hier ist was passiert:

i: Wir duplizieren die Eingabe einmal, damit wir sie zweimal auswerten können

"a")$"b")+Dies könnte eine eigene Art von Tipp sein, aber ich überprüfe hier, ob die Eingabe größer als das Zeichen "a" ist, und dann, ob sie größer als das Zeichen "b" ist, und füge das Ergebnis hinzu. Für "a" ergibt dies 0, für "b" 1 und für "c" 2.

1+0$.Hier geschieht die Magie; Wir nehmen das Ergebnis dieser vorherigen Vereinfachung und addieren 1 (geben 1 für "a", 2 für "b", 3 für "c"), drücken dann 0 und tauschen die Werte. Wenn wir den Sprung erreichen, bewegt sich dieser in die Zeile, die dem Wert entspricht, den wir diesen Zeichen zugewiesen haben (z. B. Zeile 1 für "a"). NB Zeile 0 ist der Anfang des Programms.

cole
quelle
1

Schreiben von Code, der auf zwei Arten ausgeführt werden kann

Trampoline (! ) sind sehr praktisch, wenn Sie Ihren Code vorwärts und rückwärts (oder auf und ab) ausführen möchten. Diese Szenarien sind eher unwahrscheinlich, aber für Palindrome oder ähnliche Herausforderungen kann dieser Tipp hilfreich sein.

Hier ist ein Beispiel: Ich möchte einen Code einmal ausführen, dann den Stapel durchlaufen und Werte verwerfen, bis ich 0 erreiche, und dann nach unten gehen. Der Zeiger betritt diese Schleife von der >. Sie können einen Sprung verwenden, um dies zu erreichen, z

?!v80.>ao (Angenommen, ich möchte zuerst eine neue Zeile drucken.)

aber wenn der Code , den wir einmal ausgeführt werden sollen (der Code Vergangenheit der >) macht die Zeile länger als 16 Zeichen, wir können nicht mehr den Sprung in drei Zeichen verwenden. Dies ist jedoch ein Beispiel, in dem es trivial ist, vorwärts und rückwärts zu rennen ...

?!v!?<>ao>

Wenn wir vorwärts gehen, drucken wir eine neue Zeile und drücken dann, um ?!vden Wert zu verwerfen, wenn er nicht 0 ist. Aufgrund des Trampolins überspringen wir den nächsten ?und gehen rückwärts. Das gleiche passiert und die Schleife wird fortgesetzt, bis wir eine 0 treffen.

Dies ist ein seltsam spezifisches Beispiel, aber es gibt einige (vielleicht nicht viele) Anwendungen.

cole
quelle