Ihre Aufgabe ist es, reguläre Ausdrücke zu kompilieren ... indem Sie für jedes Zeichen in einem regulären Ausdruck eine Ersetzung angeben.
Regexes
Die Regexes unterstützen diese
REGEX = (LITERAL REGEX / GROUP REGEX / STAR REGEX / ALTERNATIVE)
LITERAL = 1 / 0
GROUP = '(' REGEX ')'
STAR = (LITERAL / GROUP) '*'
ALTERNATIVE = '('REGEX ('|' REGEX)*')'
Warum nur 1 oder 0? Es dient der Vereinfachung. Der Regex hat also nur die folgenden Zeichen:
*()|10
Es wird wie folgt interpretiert:
*
ist Kleene-Stern (Wiederholung der linken Gruppe oder 0-mal oder öfter).|
ist eine Abwechslung (Übereinstimmung, wenn entweder der reguläre Ausdruck nach links oder der reguläre Ausdruck nach rechts übereinstimmt).()
gruppiert.1
stimmt mit Zeichen 1 überein.0
Entspricht dem Zeichen 0.
Wie kompiliere ich?
Sie geben sechs Codefragmente an: eines, um jedes reguläre Zeichen zu ersetzen. Zum Beispiel, wenn Ihre Antwort lautet:
*
:FSAGFSDVADFS
|
:GSDGSAG
(
:GSDG
)
:GDSIH
1
:RGIHAIGH
0
:GIHEBN
Dann ersetzen Sie jeden regulären Ausdruck durch das entsprechende Code-Snippet.
(0|11)*
wird verwandelt in:
GSDGGIHEBNGSDGSAGRGIHAIGHRGIHAIGHGDSIHFSAGFSDVADFS
Was soll das resultierende Programm tun?
Ihr Programm wird:
- Nimm die Eingabe.
- Gibt einen Wahrheitswert aus, wenn der reguläre Ausdruck mit der gesamten Eingabe übereinstimmt.
- Anderenfalls wird ein falscher Wert ausgegeben.
Eingaben außerhalb 01
sind undefiniertes Verhalten. Die Eingabe kann leer sein.
Zusätzliche Regeln
- Für ein bestimmtes Regex-Zeichen muss das resultierende Snippet immer dasselbe sein.
- Danach wird kein Präfix- oder Suffixzeichen hinzugefügt.
- Der reguläre Ausdruck ist garantiert nicht leer.
Wertung
Das am wenigsten kombinierte Snippet ist der Gewinner. Die Punktzahl für den Beispielfall würde also folgendermaßen berechnet:
FSAGFSDVADFS
+ GSDGSAG
+ GSDG
+ GDSIH
+ RGIHAIGH
+GIHEBN
12 + 7 + 4 + 5 + 8 + 6 = 42
Antworten:
Schnecken , 48 Bytes
0
->)0(\0!(l.)(~
1
->)0(\1!(l.)(~
(
->)0({{(
)
->)0}}(~
|
->)0}|{(
*
->)0),(~
Wenn wir nach Teilübereinstimmungen suchen müssten, anstatt nur die vollständigen Eingaben abzugleichen, wäre dies sehr einfach.
0
würde werden\0
,1
würde werden\1
,*
würde werden,
, und die anderen würden sich selbst zuordnen. Stattdessen gibt es eine Menge Spielereien, die verhindern, dass Spiele an einem anderen Ort als dem Anfang beginnen oder an einem anderen Ort als dem Ende enden.!(l.)
ist eine Zusicherung, die fehlschlägt, wenn der Beginn der Übereinstimmung nicht am Anfang der Eingabe liegt.~
Stimmt mit einer Zelle außerhalb der Eingabe überein, sodass sie zu allen Zeichen hinzugefügt wird, die am Ende des regulären Ausdrucks stehen dürfen. Wenn ein anderes Regex-Zeichen folgt, wird es durch einen numerischen Quantifizierer aufgehoben0
was erfordert, dass es 0-mal übereinstimmt und im Wesentlichen auskommentiert. Damit*
(,
) korrekt funktioniert, obwohl der Dummy-Out-of-Bound-Test im Weg ist, werden die Regeln für die Klammerzuordnung der Sprache häufig verwendet. Aus der Dokumentation:Klar wie Schlamm, oder?
quelle
CJam, 151 Bytes
Die Zeilen entsprechen den Zeichen
01(|)*
(in dieser Reihenfolge). Probieren Sie es online!Dies verwendet keine eingebauten regulären Ausdrücke oder andere Arten der Mustererkennung. Tatsächlich hat CJam keine dieser Funktionen. Stattdessen beginnt es mit dem regulären Ausdruck, den es darstellt, und erstellt alle möglichen Zeichenfolgen, mit denen es übereinstimmen könnte , um schließlich zu überprüfen, ob die Benutzereingabe eine davon ist.
Testläufe
Im Folgenden wird ein Programm verwendet, das einen regulären Ausdruck aus STDIN liest, jedes seiner Zeichen durch das richtige Snippet ersetzt und schließlich den generierten Code auswertet, um festzustellen, ob er mit der im Befehlszeilenargument angegebenen Eingabe übereinstimmt.
Dies ist leider nicht besonders schnell. Es wird ziemlich schnell ersticken, wenn mehr als 9 Zeichen in der Eingabe oder mehr als ein einzelner Kleene-Stern in der Regex enthalten sind.
Auf Kosten von 5 zusätzlichen Bytes - für insgesamt 156 Bytes - können kürzere Zeichenfolgen generiert werden, um die potenziellen Eingaben mit diesen abzugleichen und sie zu deduplizieren. Dies ändert nichts an der Funktionsweise des Codes. es macht es nur effizienter.
quelle
`-escaping of the
für „` im Muster*
. Unabhängig davon , dass ich dieses Programm nicht bekommen konnte jede Eingabe akzeptieren, auch für den einfachstenen Fall , in dem der Regex nur aus a0
(Test in siehe Online - Interpreter ). Am