Welche allgemeinen Tipps haben Sie zum Golfen in Retina ? Ich suche nach Ideen, die auf Code-Golf-Probleme im Allgemeinen angewendet werden können, die zumindest etwas spezifisch für Retina sind (z. B. "Kommentare entfernen" ist keine Antwort). Bitte posten Sie einen Tipp pro Antwort.
Als Referenz ist der Online - Compiler hier .
@ Sp3000 wies darauf hin, dass es auch Tipps für Regex Golf gibt . Die Antworten hier sollten sich speziell auf die Retina-Funktionen konzentrieren und nicht auf allgemeine Regex-Golftipps.
Antworten:
Kombinieren Sie nach Möglichkeit Schleifen
Bei nicht trivialen Berechnungen verwenden Sie häufig mehrere Schleifen, um Daten zu verarbeiten:
Dies läuft also,
stage1
bis die Ausgabe konvergiert, dannstage2
bis die Ausgabe konvergiert und dannstage3
bis die Ausgabe konvergiert.Es lohnt sich jedoch immer, die Phasen im Detail zu untersuchen. Manchmal ist es möglich, die Schleife
stage1, stage2, stage3, stage1, stage2, stage3, ...
stattdessen verschachtelt auszuführen (dies hängt stark davon ab, was die Stufen tatsächlich tun, aber manchmal nehmen sie vollständig orthogonale Änderungen vor oder funktionieren gut als Pipeline). In diesem Fall können Sie Bytes speichern, indem Sie sie in eine einzelne Schleife einschließen:Wenn dies
stage1
die erste oderstage3
die letzte Stufe des Programms ist, können Sie sogar eine dieser Klammern weglassen (was bedeutet, dass dadurch bereits Bytes für eine Schleife von zwei Stufen gespeichert werden können).Eine neuere Verwendung dieser Technik ist in dieser Antwort zu sehen .
quelle
Aufteilen von Saiten in gleich lange Stücke
n
Wie in den meisten "normalen" Sprachen TMTOWTDI (es gibt mehr als einen Weg, dies zu tun). Ich gehe hier davon aus, dass die Eingabe keine Zeilenvorschübe enthält und dass "Aufteilen" das Aufteilen in Zeilen bedeutet. Es gibt jedoch zwei ganz unterschiedliche Ziele: Wenn die Länge der Zeichenfolge nicht ein Vielfaches der Blocklänge beträgt, möchten Sie den unvollständigen nachfolgenden Block beibehalten oder ihn verwerfen?
Einen unvollständigen nachlaufenden Block behalten
Im Allgemeinen gibt es drei Möglichkeiten, um die Netzhaut zu spalten. Ich präsentiere hier alle drei Ansätze, da sie einen größeren Unterschied machen können, wenn Sie versuchen, sie an ein verwandtes Problem anzupassen. Sie können einen Ersatz verwenden und jedem Spiel einen Zeilenvorschub hinzufügen:
Das sind 8 Bytes (oder etwas weniger, wenn
n = 2
odern = 3
weil Sie dann..
oder...
verwenden können). Dies hat ein Problem aber: es fügt einen zusätzlichen Zeilenvorschub , wenn die String - Länge ist ein Vielfaches der Blocklänge.Sie können auch eine Split-Phase verwenden und die Tatsache nutzen, dass Captures im Split beibehalten werden:
Die
_
Option entfernt die leeren Zeilen, die sich sonst ergeben würden, wenn die gesamte Zeichenfolge mit Übereinstimmungen abgedeckt würde. Dies sind 9 Bytes, es wird jedoch kein nachfolgender Zeilenvorschub hinzugefügt. Fürn = 3
8 Bytes und fürn = 2
7 Bytes. Beachten Sie, dass Sie insgesamt ein Byte speichern können, wenn die leeren Zeilen keine Rolle spielen (z. B. weil Sie nicht leere Zeilen verarbeiten und später ohnehin Zeilenvorschübe entfernen): Dann können Sie die entfernen_
.Die dritte Option ist die Verwendung einer Übereinstimmung. Mit der
!
Option können wir alle Übereinstimmungen drucken. Um den nachfolgenden Block einzuschließen, müssen wir jedoch eine variable Übereinstimmungslänge berücksichtigen:Dies sind ebenfalls 9 Bytes und enthalten auch keinen nachgestellten Zeilenvorschub. Dies wird auch zu 8 Bytes,
n = 3
wenn Sie dies tun..?.?
. Beachten Sie jedoch, dass es auf 6 Bytes reduziert wird,n = 2
da wir jetzt nur noch brauchen..?
. Beachten Sie auch, dass dasM
gelöscht werden kann, wenn dies die letzte Stufe in Ihrem Programm ist, und auf jeden Fall ein Byte spart.Verwerfen eines unvollständigen nachfolgenden Blocks
Dies wird sehr lang, wenn Sie versuchen, dies durch einen Ersatz zu tun, da Sie den nachfolgenden Block durch nichts (falls vorhanden) und auch durch einen Split ersetzen müssen. So können wir diese ignorieren. Interessanterweise ist es beim Match-Ansatz umgekehrt: Es wird kürzer:
Das ist 7 Bytes oder weniger für
n = 2
,n = 3
. Beachten Sie erneut, dass Sie das weglassen können,M
wenn dies die letzte Stufe im Code ist.Wenn Sie hier einen nachgestellten Zeilenvorschub wünschen, können Sie diesen durch Anhängen
|$
an den regulären Ausdruck erhalten.Bonus: überlappende Stücke
Denken Sie daran, dass dies
M
die&
Option hat, die überlappende Übereinstimmungen zurückgibt (was mit Regex normalerweise nicht möglich ist). Auf diese Weise können Sie alle überlappenden Blöcke (Teilzeichenfolgen) einer Zeichenfolge einer bestimmten Länge abrufen:quelle
123456
wird123\n456
und1234567890
wird12345\n67890
??=
.