Odwrotne wyrażenie regularne odsetka złożonego

9

Koronkorko to fińskie słowo określające odsetki złożone . Nie chcemy złożonego zainteresowania naszymi ciągami, więc znajdźmy możliwie najkrótsze wyrażenie regularne, aby je wykluczyć.

Biorąc pod uwagę ciąg znaków składający się wyłącznie z wielkich liter alfabetu AZ, określ możliwie najkrótsze wyrażenie regularne pasujące do ciągu, jeśli nie zawiera ono podłańcucha KORONKORKO. KORONKORKOWyrażenie regularne nie powinno pasować do żadnego łańcucha zawierającego jako podłańcuch.

Tylko znaki A- Z, [, ], -, ^, , ?, *, +, |, (, i )powinny być wykorzystywane w wyrażeniu.

Myślę, że można to zrobić za pomocą 118 znaków w wyrażeniu. Czy możesz to skrócić?

Uwaga: To wyzwanie pochodzi od Ohjelmointiputka (po fińsku).

Gość
źródło
Gdyby !był dozwoloną postacią, mógłbyś zrobić ^((?!KORONKORO).)*$dla 19 bajtów.
Mama Fun Roll
3
@MamaFunRoll Myślę, że dlatego ! nie jest dozwolone.
Alex A.,
Świetnie się bawiłem, próbując obejść fińską stronę i uważam, że szukasz teoretycznych wyrażeń regularnych, które pasują / odrzucają ciąg wejściowy. Na przykład witryna wydaje się zezwalać na stosowanie -i ^wewnątrz klas znaków (więc ^nie może być używana jako kotwica), a dopasowanie jest liczone tylko wtedy, gdy cały ciąg jest dopasowany przez wyrażenie regularne (tj. Niejawne otoczenie ^$, ponieważ w przeciwieństwie do normalnych „wyrażeń regularnych”, które liczą ciąg jako pasujący, jeśli jakakolwiek jego część pasuje do wyrażenia regularnego)
Sp3000
W związku z tym usunąłem moją odpowiedź PCRE, która, choć powinna działać nawet w PHP, jest w tym przypadku prawie zdecydowanie niezamierzona.
Sp3000,
Zapomniałem powiedzieć, że strona sprawdza, czy wyrażenie jest poprawne przez funkcję ereg PHP. Zostało to powiedziane w dyskusji na stronie ohjelmointiputka.net/keskustelu/…
gość

Odpowiedzi:

6

204 znaki

(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?[^KO]|[^KR])|[^KO])|[^K])|[^KN])|[^KO])|[^KR])|[^KO])|[^K])*(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?)?)?)?)?)?)?)?)?

Generowany przez przekształcenie .*KORONKORKO.*w maszynę skończoną, odwrócenie maszyny skończonej i przekształcenie jej z powrotem w wyrażenie regularne.

orlp
źródło
Dlaczego stała się najlepszą odpowiedzią?
Bálint
1

Python, 77 79 97 118 bajtów

Edycja 3: Przepisz. Wykorzystuje zagnieżdżone wyprzedzenia

^([^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^O]|O(?=$|[^N]|N(?=$|[^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^K]|K(?=$|[^O]))))))))))*$

Regex 101

Edycja 2: Dodano „$ |” w całym wyrażeniu regularnym. Teraz, jeśli dopasowano prefiks KORONKORKO, następnym pasującym elementem jest koniec łańcucha, znak kończący prefiks lub znak rozszerzający prefiks, jeśli następuje po nim coś, co kończy prefiks.

Ten regex działa z re.fullmatch(), co zostało dodane w Pythonie 3.4. Aby użyć z re.match(), ^i $należy dodać odpowiednio na początku i na końcu wzorca, dla jeszcze 2 bajtów.

([^K]|K($|[^O]|O($|[^R]|R($|[^O]|O($|[^N]|N($|[^K]|K($|[^O]|O($|[^R]|R($|[^K]|K($|[^O]))))))))))*

Link Regex101

Poprzednie nieprawidłowe rozwiązanie (patrz komentarze):

K|([^K]|K([^O]|O([^R]|R([^O]|O([^N]|N([^K]|K([^O]|O([^R]|R([^K]|K[^O])))))))))*

Edycja: Dodano pojedynczy K

RootTwo
źródło
2
Nie wierzę w te mecze K.
lub
@orip - Good catch. Naprawiony.
RootTwo
Najnowsza aktualizacja kończy się niepowodzeniem dlaKKORONKORKO
Sp3000
Czy to da się naprawić? Jakieś pomysły?
RootTwo
1
Początek ^i koniec $nie są konieczne. Również =i $nie są dozwolone.
LegionMammal978