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
Odpowiedzi:
Ślimaki , 48 bajtów
0
->)0(\0!(l.)(~
1
->)0(\1!(l.)(~
(
->)0({{(
)
->)0}}(~
|
->)0}|{(
*
->)0),(~
Gdybyśmy musieli szukać częściowych dopasowań zamiast dopasowywać tylko pełne dane wejściowe, byłoby to bardzo łatwe.
0
stanie się\0
,1
stanie się\1
,*
stanie się,
, a inni odwzorują się na sobie. Zamiast tego istnieje wiele shenaniganów, aby zapobiec rozpoczynaniu się meczów w innym miejscu niż początek lub kończeniu w innym niż koniec.!(l.)
jest twierdzeniem, które zawiedzie, jeśli początek dopasowania nie będzie na początku danych wejściowych.~
dopasowuje komórkę poza wejściem, więc jest dodawana do wszystkich znaków, które mogą znajdować się na końcu wyrażenia regularnego. Jeśli występuje inny znak wyrażenia regularnego, jest on anulowany przez kwantyfikator numeryczny0
co wymaga dopasowania 0 razy, w zasadzie komentowania. Aby zezwolić*
(,
) na poprawne działanie, pomimo tego, że przeszkadza w tym fikcyjny test „out-out-out”, reguły dopasowania nawiasów językowych są mocno używane. Z dokumentacji:Czysty jak błoto, prawda?
źródło
CJam, 151 bajtów
Wiersze odpowiadają znakom
01(|)*
(w tej kolejności). Wypróbuj online!Nie używa to wbudowanego wyrażenia regularnego ani innych typów dopasowywania wzorców. W rzeczywistości CJam nie ma żadnej z tych funkcji. Zamiast tego zaczyna się od wyrażenia regularnego, które reprezentuje, i buduje wszystkie możliwe ciągi, które mógłby dopasować, aby w końcu sprawdzić, czy dane wejściowe użytkownika są jednym z nich.
Przebiegi testowe
W poniższym przykładzie użyto programu, który odczytuje wyrażenie regularne ze STDIN, zastępuje każdy z jego znaków odpowiednim fragmentem kodu i ostatecznie ocenia wygenerowany kod, aby sprawdzić, czy pasuje on do danych wejściowych określonych w argumencie wiersza poleceń.
Niestety nie jest to szczególnie szybkie. Dusi się dość szybko, jeśli na wejściu jest więcej niż 9 znaków lub więcej niż jedna gwiazda Kleene w wyrażeniu regularnym.
Kosztem 5 dodatkowych bajtów - w sumie 156 bajtów - możemy wygenerować krótsze ciągi, aby dopasować potencjalne dane wejściowe i deduplikować je. Nie zmienia to działania kodu; po prostu sprawia, że jest bardziej wydajny.
źródło
`-escaping of the
że wzorzec jest zbyteczny. "*
Niezależnie od tego, nie mogłem zmusić tego programu do przyjęcia jakichkolwiek danych wejściowych, nawet w najprostszym przypadku, gdy wyrażenie regularne składa się tylko z0
(patrz test w tłumaczu online ). Am Czy robię to źle?