Mamy już problem z meta-regex-golfem zainspirowany komiksem xkcd
Ale ten regex golf też wygląda zabawnie! Chcę rozróżnić stany USA i regiony Włoch. Czemu? Jestem obywatelem obu krajów i zawsze mam z tym problem * .
Regiony Włoch to
Abruzzo, Valle d'Aosta, Puglia, Basilicata, Calabria, Campania, Emilia-Romagna, Friuli-Venezia Giulia, Lazio, Liguria, Lombardia, Marche, Molise, Piemonte, Sardegna, Sicilia, Trentino-Alto Adige/Südtirol, Toscana, Umbria, Veneto
i stany USA są
Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin, Wyoming
Twoim zadaniem jest napisanie programu, który odróżnia te listy wyrażeniem regularnym. To jest nowa gra, więc oto
Zasady
- Rozróżnienia między listami należy dokonać za pomocą jednego pasującego wyrażenia regularnego.
- Twój wynik to długość tego wyrażenia regularnego, im mniej, tym lepiej.
Żeby było jasne: wszystkie prace muszą być wykonywane przez wyrażenie regularne - bez filtrowania, bez zamian, bez niczego ... nawet jeśli są one również wykonywane przy użyciu wyrażeń regularnych. Oznacza to, że dane wejściowe powinny być przekazywane bezpośrednio do wyrażenia regularnego, a tylko odpowiedź binarna (dopasowanie / brak dopasowania) może być wykorzystana w późniejszych częściach kodu. Dane wejściowe nigdy nie powinny być sprawdzane ani zmieniane za pomocą pasującego wyrażenia. Wyjątek : jedzenie nowej linii z czymś podobnym do Ruby chomp
jest w porządku.
Twój program powinien pobrać pojedynczy wpis (opcjonalnie po nim \n
lub EOF
jeśli to ułatwia) z dowolnej listy ze standardowego wejścia i wypisać na standardowe wyjście nazwę tej listy. W takim przypadku nasze listy mają nazwy Italy
i USA
.
Aby przetestować kod, po prostu uruchom obie listy. Zachowanie może być niezdefiniowane dla ciągów, które nie występują na liście.
Problemy z punktowaniem
Może być to konieczne w zależności od języka. W Perlu
m/foobarbaz/
jest pasującym wyrażeniem regularnym. Jednak w Pythonie
import re
re.compile('foobarbaz')
robi to samo. Nie liczymy cytatów dla Pythona, więc mówię, że nie liczymy m/
ostatecznego wyniku /
w Perlu. W obu językach powyższe powinny otrzymać wynik 9.
Aby wyjaśnić punkt podniesiony przez Abhijita , rzeczywista długość pasującego wyrażenia jest wynikiem, nawet jeśli wygenerujesz go dynamicznie. Na przykład, jeśli znalazłeś magiczne wyrażenie m
,
n="foo(bar|baz)"
m=n+n
to nie powinieneś zgłaszać wyniku 12: m
ma długość 24. I dla jasności, wygenerowane wyrażenie regularne nie może zależeć od danych wejściowych. To byłoby odczytanie danych wejściowych przed przekazaniem ich do wyrażenia regularnego.
Przykładowa sesja
input> Calabria
Italy
input> New Hampshire
USA
input> Washington
USA
input> Puglia
Italy
* Właściwie to kłamstwo. Nigdy nie miałem z tym żadnych problemów.
źródło
USA
w przypadku takiego ciągu, dlatego musiałbyś po prostu sprawdzić regiony włoskie i zwrócićUSA
inaczej.Odpowiedzi:
Perl -
5136 bajtów (dla wyrażeń regularnych)Nic specjalnego, ale równie dobrze może to opublikować, ponieważ różni się od innych 51-bajtowych rozwiązań.Lub alternatywnie, skróć moje i tak już krótkie rozwiązanie o 15 bajtów. Myślę, że to na razie wygrywa.
źródło
Perl, 40 znaków
Podejście do tego z innej strony, tj. Dopasowanie stanów USA:
Jedyną właściwością Perla / PCRE w
\b
wyrażeniu regularnym jest kotwica granicy słowa, której użyłem zamiast$
kotwicy końca łańcucha, aby dopasować ją do „Południowej Karoliny”.Oto wyrażenie regularne w linijce Perla do testowania:
źródło
Ruby (zwykłe wyrażenie regularne), 44
Wiesz co? Rozróżnianie wielkości liter to najlepsza kotwica na początku słowa.
Nie jestem pewien, ale myślę, że zawdzięczam
pa
do odpowiedzi Hax0r778 użytkownika .źródło
Perl - 51
źródło
JavaScript 42
alert(/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(prompt())?"Italy":"USA")
Początkowo zamierzałem to wypracować ze strony USA, ponieważ wyeliminowanie KWXY z listy USA usuwa wiele stanów z dala od Stanów ... Ale Włochy pokonały dobre 17 znaków ...
Jeśli zastosujemy zapis grubą strzałką, możemy zredukować to do prostej funkcji ze zmienną zwracaną.
r=s=>/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(s)?"Italy":"USA"
źródło