Twoim zadaniem jest skompilowanie wyrażeń regularnych ... poprzez określenie podstawienia każdej postaci w wyrażeniu regularnym.
Regeksy
Wyrażenia regularne obsługują je
REGEX = (LITERAL REGEX / GROUP REGEX / STAR REGEX / ALTERNATIVE)
LITERAL = 1 / 0
GROUP = '(' REGEX ')'
STAR = (LITERAL / GROUP) '*'
ALTERNATIVE = '('REGEX ('|' REGEX)*')'
Dlaczego tylko 1 lub 0? To dla uproszczenia. Wyrażenie regularne ma zatem tylko następujące znaki:
*()|10
Jest interpretowany w następujący sposób:
*
jest gwiazdą Kleene (powtórz lewą grupę lub dosłownie 0 lub więcej razy).|
jest naprzemiennie (dopasuj, jeśli wyrażenie regularne w lewo lub wyrażenie regularne w prawo pasuje).()
grupuje.1
dopasowuje znak 1.0
dopasowuje znak 0.
Jak skompilować?
Podajesz sześć fragmentów kodu: jeden, aby zastąpić każdy znak wyrażenia regularnego. Na przykład, jeśli Twoja odpowiedź brzmi:
*
:FSAGFSDVADFS
|
:GSDGSAG
(
:GSDG
)
:GDSIH
1
:RGIHAIGH
0
:GIHEBN
Następnie zamieniasz każde wyrażenie regularne na odpowiedni fragment kodu, więc:
(0|11)*
zamienia się w:
GSDGGIHEBNGSDGSAGRGIHAIGHRGIHAIGHGDSIHFSAGFSDVADFS
Co powinien zrobić wynikowy program?
Twój program będzie:
- Weź wkład.
- Wypisuje prawdziwą wartość, jeśli wyrażenie regularne pasuje do całego wejścia.
- W przeciwnym razie wypisz wartość fałsz.
Wejście na zewnątrz 01
jest uważane za niezdefiniowane zachowanie. Dane wejściowe mogą być puste.
Dodatkowe zasady
- W przypadku danego znaku wyrażenia regularnego wynikowy fragment kodu musi zawsze być taki sam.
- Później nie jest dodawany żaden prefiks ani sufiks.
- Wyrażenie regularne jest na pewno niepuste.
Punktacja
Najmniej połączony fragment jest zwycięzcą. Tak więc wynik dla przykładowego przypadku oblicza się w następujący sposób:
FSAGFSDVADFS
+ GSDGSAG
+ GSDG
+ GDSIH
+ RGIHAIGH
+GIHEBN
12 + 7 + 4 + 5 + 8 + 6 = 42