Perl- und PCRE-Regex, 280 Byte
^(?=(.*z){2})(?=(.*\(){43})(?=(.*\)){43})(?=(.*\*){22})(?=(.*\.){23})(?=(.*0){2})(?=(.*1){6})(?=(.*2){16})(?=(.*3){7})(?=(.*4){4})(?=(.*5){1})(?=(.*6){3})(?=(.*7){2})(?=(.*8){2})(?=(.*9){1})(?=(.*=){22})(?=(.*\?){22})(?=(.*\\){11})(?=(.*\^){2})(?=(.*\{){23})(?=(.*\}){23}).{280}\z
(Etwas) besser lesbar:
^
(?=(.*z){2})
(?=(.*\(){43})
(?=(.*\)){43})
(?=(.*\*){22})
(?=(.*\.){23})
(?=(.*0){2})
(?=(.*1){6})
(?=(.*2){16})
(?=(.*3){7})
(?=(.*4){4})
(?=(.*5){1})
(?=(.*6){3})
(?=(.*7){2})
(?=(.*8){2})
(?=(.*9){1})
(?=(.*=){22})
(?=(.*\?){22})
(?=(.*\\){11})
(?=(.*\^){2})
(?=(.*\{){23})
(?=(.*\}){23})
.{280}\z
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})
das z
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:
^(?=(.*z){2})(?=(.*\(){39})(?=(.*\)){39})(?=(.*\*){20})(?=(.*\.){21})(?=(.*0){4})(?=(.*1){6})(?=(.*2){11})(?=(.*3){6})(?=(.*4){3})(?=(.*5){2})(?=(.*6){3})(?=(.*9){4})(?=(.*=){20})(?=(.*\?){20})(?=(.*\\){9})(?=(.*\^){2})(?=(.*{){21})(?=(.*}){21}).{253}\z
Lesbare Version:
^
(? = (. * z) {2})
(? = (. * \ () {39})
(? = (. * \)) {39})
(? = (. * \ *) {20})
(? = (. * \.) {21})
(? = (. * 0) {4})
(? = (. * 1) {6})
(? = (. * 2) {11})
(? = (. * 3) {6})
(? = (. * 4) {3})
(? = (. * 5) {2})
(? = (. * 6) {3})
(? = (. * 9) {4})
(? = (. * =) {20})
(? = (. * \?) {20})
(? = (. * \\) {9})
(? = (. * \ ^) {2})
(? = (. * {) {21})
(? = (. *}) {21})
. {253} \ z