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:
.{n}
$&¶
Das sind 8 Bytes (oder etwas weniger, wenn n = 2
oder n = 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:
S_`(.{n})
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ür n = 3
8 Bytes und für n = 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:
M!`.{1,n}
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 das M
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:
M!`.{n}
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:
M!&`.{n}