Ihre Herausforderung besteht darin, einen regulären Ausdruck zu erstellen, der zu jeder String-Permutation passt, und zu nichts anderem. Bei der Übereinstimmung muss auch zwischen Groß- und Kleinschreibung unterschieden werden.
Also, zum Beispiel, wenn Ihre Regex ist:
ABC
Es sollte mit diesen Zeichenfolgen übereinstimmen (und nur übereinstimmen):
ABC
ACB
BAC
BCA
CAB
CBA
Es sollte nicht mit Dingen wie übereinstimmen:
AABC (contains an extra A)
ABCD (contains an extra D)
AC (no B)
AAA (no B and C, extra 2 A's)
abc (case-sensitive)
Regeln:
- Sie dürfen jede Regex-Variante verwenden, die Sie mögen.
- Es gelten Standardlücken.
- Sie müssen mindestens zwei verschiedene Zeichen in Ihrem Code haben. Das heißt, Lösungen wie
1
sind ungültig. - Der reguläre Ausdruck sollte nur druckbares ASCII und sonst nichts enthalten.
(ABC|ACB|BAC|BCA|CAB|CBA)
aber du wolltest eine verallgemeinerte Antwort.Antworten:
JavaScript,
6457 Bytes4 Bytes entfernt dank Martin Ender.
Probieren Sie es hier aus.
Erläuterungen (veraltet)
quelle
^(?!.*(\S)(.*\1){3}[^1]?)[]zzSS[-^?!!.'''-*1{33}0066-]{60}\z
regex101^(?'4'(?!(.*\4){3})[]$$[\\^^?!!..'-*{}33-5-]){54}$[5]*
Perl- und PCRE-Regex, 280 Byte
(Etwas) besser lesbar:
Dies läuft in O (2 ^ n) -Zeit ab, wie beschrieben, und ist daher unglaublich ineffizient. Der einfachste Weg, dies zu testen, besteht darin, jedes Vorkommen von
.*
durch zu ersetzen.*?
, wodurch der Fall, in dem es übereinstimmt, zuerst überprüft wird (was bedeutet, dass es in linearer Zeit übereinstimmt, aber immer noch exponentielle Zeit benötigt, wenn es nicht übereinstimmt).Die Grundidee ist, dass wir die Länge des regulären Ausdrucks auf 280 erzwingen und Lookahead-Aussagen verwenden, um zu erzwingen, dass jedes Zeichen im regulären Ausdruck mindestens eine bestimmte Anzahl von Malen vorkommt, z. B. dass
(?=(.*z){2})
dasz
Zeichen mindestens zweimal vorkommt.2+43+43+22+23+2+6+16+7+4+1+3+2+2+1+22+22+11+2+23+23
ist 280, wir können also keine "zusätzlichen" Vorkommen von Zeichen haben.Dies ist ein Programmierbeispiel für ein Autogramm , ein Satz, der sich selbst beschreibt, indem die Nummer jedes darin enthaltenen Zeichens (und in diesem Fall auch die Gesamtlänge) aufgelistet wird. Ich hatte ziemlich viel Glück bei der Erstellung (normalerweise muss man Brute Force anwenden, aber ich bin beim Testen meines Brute-Force-Programms über diese Lösung gestolpert, bevor ich es vollständig fertig geschrieben hatte).
Perl und PCRE regex, 253 Byte, in Zusammenarbeit mit Martin Ender
Ich nahm an, dass es kürzere Lösungen geben könnte, bei denen einige Ziffern weggelassen werden (höchstwahrscheinlich 9, 8 oder 7). Martin Ender hat einen gefunden, siehe unten:
Lesbare Version:
quelle
{}
in den letzten beiden Lookaheads entkommen müssen . Sie müssen auch keine Dinge wie hinzufügen,(?=(.*5){1})
da es keine gäbe,5
wenn Sie nicht diesen Lookahead hätten. Ein Problem ist,$
dass ein nachlaufender Zeilenvorschub möglich ist, sodass Sie diesen\z
anstelle von$
jimmy verwenden müssen, aber das kostet Sie, glaube ich, kein Byte, da Sie den\
im ersten Lookahead speichern .$
Zulassen einer neuen Zeile am Ende der Zeichenfolge hängt im Allgemeinen davon ab, wie der reguläre Ausdruck von der Umgebung aufgerufen wird Programm (normalerweise werden sie mit Code ausgeführt, der bereits in Zeilen zerlegt wurde).(?=(.*5){1})
in diesem Fall. Wenn ich es entfernen würde, gäbe es eine 5 im Programm, weil die(?=(.*1){6})
Zeile jetzt lesen müsste(?=(.*1){5})
.$
zu "\z
nicht schaden" (und "nicht schaden") das Autogramm nicht brechen).\$
…$
zuz
…\z
. Das funktioniert; Ich werde es ändern gehen.