Wprowadzenie
Nie widzę tu wielu wyzwań wyrażeń regularnych, więc chciałbym zaoferować to zwodniczo proste, które można wykonać na wiele sposobów, używając wielu smaków wyrażeń regularnych. Mam nadzieję, że zapewni entuzjastom regex trochę radości z gry w golfa.
Wyzwanie
Wyzwanie polega na dopasowaniu tego, co bardzo luźno nazwałam serią „egalitarną”: serią jednakowej liczby różnych postaci. Najlepiej to opisuje przykłady.
Mecz:
aaabbbccc
xyz
iillppddff
ggggggoooooollllllffffff
abc
banana
Nie pasuj:
aabc
xxxyyzzz
iilllpppddff
ggggggoooooollllllfff
aaaaaabbbccc
aaabbbc
abbaa
aabbbc
Uogólniając, chcemy dopasować temat formularza ( dla dowolnej listy znaków do , gdzie dla wszystkichc1)n(c2)n(c3)n...(ck)n
c1
ck
ci != ci+1
i, k > 1, and n > 0.
Wyjaśnienia:
Dane wejściowe nie będą puste.
Znak może się powtórzyć później w ciągu (np. „Banan”)
k > 1
, więc w łańcuchu zawsze będą znajdować się co najmniej 2 różne znaki.Możesz założyć, że tylko znaki ASCII będą przekazywane jako dane wejściowe, a żaden znak nie będzie zakończeniem linii.
Zasady
(Dziękuję Martinowi Enderowi za ten doskonale określony blok zasad)
Twoja odpowiedź powinna składać się z jednego wyrażenia regularnego, bez dodatkowego kodu (z wyjątkiem, opcjonalnie, listy modyfikatorów wyrażeń regularnych wymaganych do działania rozwiązania). Nie wolno używać funkcji smaku regularnego swojego języka, które pozwalają na wywołanie kodu w języku hostingowym (np. e
Modyfikator Perla ).
Możesz użyć dowolnego smaku wyrażenia regularnego, który istniał przed tym wyzwaniem, ale określ go.
Nie zakładaj, że wyrażenie regularne jest zakotwiczone niejawnie, np. Jeśli używasz języka Python, załóż, że wyrażenie regularne jest używane z re.search, a nie z re.match. Twoje wyrażenie regularne musi pasować do całego łańcucha dla prawidłowych łańcuchów egalitarnych i nie może dawać żadnych dopasowań dla łańcuchów nieprawidłowych. Możesz użyć dowolnej liczby grup przechwytywania.
Możesz założyć, że wejście będzie zawsze ciągiem dwóch lub więcej znaków ASCII niezawierających żadnych terminatorów linii.
To jest wyrażenie regularne, więc wygrywa najkrótszy wyrażenie regularne w bajtach. Jeśli twój język wymaga (zwykle /.../
) ograniczników do wyrażenia regularnego, nie licz samych ograniczników. Jeśli Twoje rozwiązanie wymaga modyfikatorów, dodaj jeden bajt na modyfikator.
Kryteria
To dobry golf, więc zapomnij o wydajności i po prostu staraj się, aby regex był jak najmniejszy.
Podaj użyty smak wyrażenia regularnego i, jeśli to możliwe, dołącz link pokazujący demonstrację online wyrażenia w akcji.
źródło
banana
egalitarna.Odpowiedzi:
Smak .NET, 48 bajtów
Wypróbuj online! (za pomocą Retina )
Okazuje się, że nie negowanie logiki jest jednak prostsze. Robię z tego osobną odpowiedź, ponieważ te dwa podejścia są zupełnie inne.
Wyjaśnienie
źródło
((^.|\2(?=.*\4\3)|\4(?!\3))(?=\2*+((.)\3?)))+\3$
eksperymentowałem\3*
zamiast(?!\3)
zrobić 45b, ale to nie działa na „aabbbc” :( Wersja Perla jest łatwiejsza do zrozumienia, a teraz do 45b:^((?=(.)\2*(.))(?=(\2(?4)?\3)(?!\3))\2+)+\3+$
- powód, który nazywam Perl, mimo że to wydaje się być poprawnym PCRE polega na tym, że PCRE uważa, że(\2(?4)?\3)
może się powtarzać w nieskończoność, podczas gdy Perl jest trochę mądrzejszy / wybaczający!Smak .NET, 54 bajty
Wypróbuj online!(za pomocą Retina )
Jestem prawie pewien, że jest to nieoptymalne, ale jest to najlepsze, co mogę teraz wymyślić dla równoważenia grup. Mam jedną alternatywę przy tej samej liczbie bajtów, która jest w większości taka sama:
Wyjaśnienie
Główną ideą jest odwrócenie problemu, dopasowanie nie-egalitarnych łańcuchów i postawienie całej sprawy w negatywnym spojrzeniu, aby zanegować wynik. Korzyścią jest to, że nie musimy śledzić liczby n w całym łańcuchu (ponieważ ze względu na naturę grup równoważących zwykle zużywasz n podczas sprawdzania), aby sprawdzić, czy wszystkie przebiegi są równej długości. Zamiast tego szukamy tylko jednej pary sąsiednich przebiegów, które nie mają tej samej długości. W ten sposób muszę użyć n tylko raz.
Oto podział wyrażenia regularnego.
źródło
banana
,aba
,bbbaaannnaaannnaaa
,bbbaaannnaaannnaaaaaa
,The Nineteenth Byte
,11
,110
,^(?!.*(?<=(\2)*(.))(?!\2)(?>(.)(?<-1>\3)*)(?(1)|\3)).+
,bababa
. To ja zawiodłem. :( +1