Zrób regliksową poliglotę

19

Napisz wyrażenie regularne, które działa w co najmniej 2 smakach regularnych (lub wersjach), i dopasuj inny ciąg w każdym smaku (lub wersji), w którym działa.

Ciągi, które należy dopasować w tym wyzwaniu, to pierwsze słowa nazw kodowych Ubuntu, które są wymienione poniżej. Wyrażenie regularne musi pasować do początku listy. To znaczy, jeśli regex swoich prac w 3 smakach, to musi pasować Warty Hoaryi Breezy, a nie innych.

Warty
Hoary
Breezy
Dapper
Edgy
Feisty
Gutsy
Hardy
Intrepid
Jaunty
Karmic
Lucid
Maverick
Natty
Oneiric
Precise
Quantal
Raring
Saucy
Trusty
Utopic
Vivid
Wily
Xenial
Yakkety
Zesty
17.10
18.04
18.10
19.04
19.10
...

Jeśli twoje wyrażenie regularne działa w ponad 26 wersjach, możesz zamiast tego dopasować numery wersji Ubuntu. Począwszy od 17.10, dla każdego nowego smaku zmień drugą liczbę na 10, jeśli była to 04, i zwiększ pierwszą liczbę, a drugą zmień na 04 w przeciwnym razie.

W każdym smaku wyrażenie regularne powinno pasować tylko do domniemanego ciągu i nic więcej (nie ogranicza się do nazw kodowych). Końcowe znaki nowej linii nie mają znaczenia. Oznacza to, że wyrażenie regularne może dopasować tylko ciąg bez nowej linii, dopasować tylko ciąg z nową linią lub dopasować oba. I nie musi być spójny w różnych smakach. Możesz założyć, że dane wejściowe są w drukowanym formacie ASCII (z wyjątkiem końcowego nowego wiersza, jeśli taki istnieje).

Twój wynik to (długość kodu + 10) / ((liczba smaków) ^ 2). Najniższy wynik wygrywa.

jimmy23013
źródło
1
Aby to sprawdzić - „W każdym smaku wyrażenie regularne powinno pasować tylko do domniemanego ciągu i nic więcej.”, Oznacza to, że każde wyrażenie regularne powinno pasować tylko do jednej nazwy wersji Ubuntu i żadnej z pozostałych nazw, ale potencjalnie może pasować do innej wersji innej niż wersja ciągi nazw, czy oznacza to, że wyrażenie regularne może pasować tylko do tego dokładnie ciągu, a nie innych ciągów, nawet jeśli nie jest to nazwa wersji z powyższej listy?
Sp3000,
@ Sp3000 Powinien pasować do tego dokładnie ciągu, a nie innych ciągów.
jimmy23013

Odpowiedzi:

24

87 bajtów, 5 smaków, (87 + 10) / 25 = 3,88

^(((?=W)[[:word:]&&]art|Ho(?=a)\ar|Bre(?=ez)[]e]\z|E(?=dg)[[d]]g)y|(?=Da)[D-[E]]apper)$

Na razie wybrałem łatwe do przetestowania smaki, które są:

Ogólna struktura to ^((...)y|...)$, tj. Rozłożenie końcowych znaków yi dodanie kotwic.

Warty (PCRE)

(?=W)[[:word:]&&]art

W PCRE i Ruby [[:word:]]jest klasa znaków POSIX pasująca do znaku słowa - w innych smakach otrzymujesz [[:word:]klasę znaków, a następnie literał &&], co nie powiedzie się (?=W). Aby Ruby zawiodło, &&służy do przecinania klasy POSIX bez niczego, podczas gdy w PCRE &&nie ma specjalnego znaczenia.

Hoary (JavaScript)

Ho(?=a)\ar

Z jakiegoś powodu JavaScript jest jedynym smakiem z grona, w którym \ajest dosłowny a- w innych smakach pasuje do znaku dzwonka (ASCII 7).

Wietrzny (Python)

Bre(?=ez)[]e]\z

W Pythonie i JavaScript \zjest dosłowny z- w innych smakach jest to odpowiednik $końca łańcucha znaków. Aby JavaScript nie działał, używamy klasy char []e], która jest pustą klasą char, []a następnie dosłownie e]w Javascripcie, a klasa dwóch znaków []e]w Pythonie.

Dapper (.NET)

(?=Da)[D-[E]]apper

In .NET, [D-[E]]to różnica zestawu, usunięcie zestawu [E]z [D]. W PCRE, JavaScript i Python mamy klasę, [D-[E]a następnie literał ]. Ruby jest trochę inna, ale z jakiegoś powodu analizuje ją jako klasę, [D-[E]]która tylko pasuje E, a ja jeszcze nie wiem, dlaczego ...

Edgy (Ruby)

E(?=dg)[[d]]g

Ruby zezwala na klasy char wewnątrz klas char, więc w [[d]]rzeczywistości jest równoważny [d]lub po prostu d. W innych smakach mamy [[d]dosłowność ].

Sp3000
źródło