Einführung
Ich sehe hier nicht viele Regex-Herausforderungen, daher möchte ich diese täuschend einfache anbieten, die auf verschiedene Arten mit einer Reihe von Regex-Varianten durchgeführt werden kann. Ich hoffe, es bietet Regex-Enthusiasten ein bisschen Spaß beim Golfen.
Herausforderung
Die Herausforderung besteht darin, zu einer "egalitären" Serie zu passen, die ich sehr locker genannt habe: eine Serie mit der gleichen Anzahl verschiedener Charaktere. Dies lässt sich am besten anhand von Beispielen beschreiben.
Spiel:
aaabbbccc
xyz
iillppddff
ggggggoooooollllllffffff
abc
banana
Nicht übereinstimmen:
aabc
xxxyyzzz
iilllpppddff
ggggggoooooollllllfff
aaaaaabbbccc
aaabbbc
abbaa
aabbbc
Verallgemeinern wollen wir einen Gegenstand der Form entsprechen ( für jede Liste von Zeichen auf , wo für allec1)n(c2)n(c3)n...(ck)n
c1
ck
ci != ci+1
i, k > 1, and n > 0.
Klarstellungen:
Die Eingabe wird nicht leer sein.
Ein Zeichen kann sich später in der Zeichenfolge wiederholen (z. B. "Banane")
k > 1
Es werden also immer mindestens 2 verschiedene Zeichen in der Zeichenkette sein.Sie können davon ausgehen, dass nur ASCII-Zeichen als Eingabe übergeben werden und kein Zeichen ein Zeilenabschlusszeichen ist.
Regeln
(Vielen Dank an Martin Ender für dieses hervorragend formulierte Regelwerk)
Ihre Antwort sollte aus einem einzelnen regulären Ausdruck ohne zusätzlichen Code bestehen (mit Ausnahme einer optionalen Liste von regulären Ausdrucksmodifikatoren, die erforderlich sind, damit Ihre Lösung funktioniert). Sie dürfen keine Funktionen der Regex-Variante Ihrer Sprache verwenden, mit denen Sie Code in der Hosting-Sprache aufrufen können (z. B. der Perl- e
Modifikator).
Sie können jedes Regex-Aroma verwenden, das vor dieser Herausforderung existierte, aber geben Sie das Aroma an.
Gehen Sie nicht davon aus, dass der reguläre Ausdruck implizit verankert ist, z. B. wenn Sie Python verwenden, gehen Sie davon aus, dass der reguläre Ausdruck mit re.search und nicht mit re.match verwendet wird. Ihre Regex muss für gültige egalitäre Zeichenfolgen mit der gesamten Zeichenfolge übereinstimmen und für ungültige Zeichenfolgen keine Übereinstimmungen ergeben. Sie können beliebig viele Erfassungsgruppen verwenden.
Sie können davon ausgehen, dass die Eingabe immer eine Zeichenfolge aus zwei oder mehr ASCII-Zeichen ohne Zeilenabschluss ist.
Dies ist Regex-Golf, also gewinnt der kürzeste Regex in Bytes. Wenn in Ihrer Sprache (normalerweise /.../
) Begrenzer für reguläre Ausdrücke erforderlich sind, zählen Sie die Begrenzer nicht selbst. Wenn Ihre Lösung Modifikatoren erfordert, fügen Sie ein Byte pro Modifikator hinzu.
Kriterien
Dies ist ein altmodisches Golfspiel. Vergessen Sie also die Effizienz und versuchen Sie einfach, Ihre Regex so klein wie möglich zu halten.
Bitte geben Sie an, welche Regex-Variante Sie verwendet haben, und fügen Sie nach Möglichkeit einen Link hinzu, der eine Online-Demo Ihres Ausdrucks in Aktion zeigt.
quelle
banana
ist egalitär.Antworten:
.NET-Variante, 48 Byte
Probieren Sie es online! (mit Retina )
Nun, es stellt sich heraus, dass es immerhin einfacher ist, die Logik nicht zu negieren. Ich mache hier eine separate Antwort, weil die beiden Ansätze völlig unterschiedlich sind.
Erläuterung
quelle
((^.|\2(?=.*\4\3)|\4(?!\3))(?=\2*+((.)\3?)))+\3$
Ich war das Experimentieren mit\3*
anstatt(?!\3)
zu machen , 45b aber , dass nicht auf „aabbbc“ :( Die Perl - Version ist leichter zu verstehen, und es ist bis jetzt 45b:^((?=(.)\2*(.))(?=(\2(?4)?\3)(?!\3))\2+)+\3+$
- der Grund , warum ich es nennen Perl , obwohl es PCRE scheint gültig zu sein, ist, dass PCRE glaubt,(\2(?4)?\3)
auf unbestimmte Zeit wiederkehren zu können, während Perl ein wenig schlauer / nachsichtig ist!.NET-Variante, 54 Byte
Probieren Sie es online! (mit Retina )
Ich bin mir ziemlich sicher, dass dies nicht optimal ist, aber es ist das Beste, was ich mir derzeit für Bilanzkreise einfallen lässt. Ich habe eine Alternative mit der gleichen Byteanzahl, die größtenteils gleich ist:
Erläuterung
Die Hauptidee ist, das Problem umzukehren, nicht egalitäre Zeichenfolgen zuzuordnen und das Ganze in einen negativen Lookahead zu setzen, um das Ergebnis zu negieren. Der Vorteil ist, dass wir n nicht über den gesamten String hinweg verfolgen müssen (da Sie aufgrund der Art der Bilanzkreise normalerweise n beim Überprüfen verwenden), um zu überprüfen, ob alle Läufe gleich lang sind. Stattdessen suchen wir nur ein einzelnes Paar benachbarter Läufe, die nicht die gleiche Länge haben. Auf diese Weise muss ich n nur einmal verwenden.
Hier ist eine Aufschlüsselung der Regex.
quelle
banana
,aba
,bbbaaannnaaannnaaa
,bbbaaannnaaannnaaaaaa
,The Nineteenth Byte
,11
,110
,^(?!.*(?<=(\2)*(.))(?!\2)(?>(.)(?<-1>\3)*)(?(1)|\3)).+
,bababa
. Ich habe versagt. :( +1