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)
o
, und da Newline\n
ASCII 10 ist, können Sie dies tunao
.CR
stattLF
und schobd
statta
.Antworten:
Überprüfung gegen 0
Mit
?!
anstelle von wird0=?
normalerweise ein Byte gespeichert.?
Manchmal ist jedoch nur ein Standard besser, wenn Sie sich eine gewisse Umstrukturierung leisten könnengegen
quelle
Überprüfung auf EOF
Wenn EOF erreicht ist, schiebt> <> ein -1 auf den Stapel, was auf zwei Arten überprüft werden kann:
Bei der Überprüfung auf EOF handelt es sich um Negationen. Welche davon vorteilhafter ist, hängt von der Struktur Ihres Programms ab.
quelle
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,
kann so gemacht werden, dass es in eine Zeile passt:
Als praktisches Beispiel ist hier das Hello World-Programm in einer Zeile:
quelle
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.
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.
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| = 1
und 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).quelle
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.)Dies ist zwar in Ordnung, hat jedoch einige Leerzeichen (die ich persönlich nie gerne sehe) und es gibt viele Wiederholungen (
=?v
und.00n
). Stattdessen können Sie einen Sprung und verschiedene Zeilen als Bedingung verwenden. Hier ist ein Beispiel: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.quelle
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
?!v
den 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.
quelle