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.1dopasowuje znak 1.0dopasowuje 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 01jest 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