Regex Golf: Regiony Włoch kontra Stany USA

23

Mamy już problem z meta-regex-golfem zainspirowany komiksem xkcd

prawa autorskie 2013 Randall Munroe

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 chompjest w porządku.

Twój program powinien pobrać pojedynczy wpis (opcjonalnie po nim \nlub EOFjeś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 Italyi 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: mma 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.

boothby
źródło
Czy możesz wyjaśnić, co rozumiesz przez „bez filtrowania, bez zamian, bez niczego ... nawet jeśli są one również wykonywane przy użyciu wyrażeń regularnych”. Wyjaśniając, czy oznacza to filtrowanie, zastępowanie listy stanów / regionów, czy koncentracja jest szersza?
Abhijit,
@Abhijit edytowane. Czy to jest jaśniejsze?
stoisko
3
@ Eliseod'Annunzio: DC nie jest stanem
Kyle Kanos
1
„Zachowanie może być niezdefiniowane dla ciągów, które nie występują na liście.” ta zasada jest zepsuta : pozwala powrócić USAw przypadku takiego ciągu, dlatego musiałbyś po prostu sprawdzić regiony włoskie i zwrócić USAinaczej.
o0 ”.
1
@boothby cóż, nie, to prosta logika: w zasadzie prosi tylko o wyrażenie regularne w celu dopasowania do włoskich regionów, ale niepotrzebnie sformułowane w znacznie bardziej skomplikowany sposób. Dzięki temu błędowi cała kwestia dotycząca stanów amerykańskich nie ma żadnego związku z rzeczywistym pytaniem. To sprawia, że ​​pytanie jest znacznie mniej interesujące.
o0 ”.

Odpowiedzi:

10

Perl - 51 36 bajtów (dla wyrażeń regularnych)

print<>=~/.A|ise|net|te|z.o|[cp]a|[lr]ia|r[cd]/?"Italy
":"USA
"

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.

Konrad Borowski
źródło
7

Perl, 40 znaków

Podejście do tego z innej strony, tj. Dopasowanie stanów USA:

[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b

Jedyną właściwością Perla / PCRE w \bwyraż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:

perl -nE 'say /[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b/ ? "USA" : "Italy"'
Ilmari Karonen
źródło
To jest bardziej golfowa uprząż testowa: perl -pe '$ _ = / re /? "USA \ n": "Włochy \ n"'
pseudonim
3
@Pseudonim: meh. Tak długo, jak nie liczy się w wyniku, równie dobrze może zachować czytelność.
Ilmari Karonen
5

Ruby (zwykłe wyrażenie regularne), 44

$_ = gets.chomp
puts /'|-|(([^gn]i|gn|at)a|[hst]e|to|zo)$|To|La|pa/ ? "Italy" : "USA"

Wiesz co? Rozróżnianie wielkości liter to najlepsza kotwica na początku słowa.

Nie jestem pewien, ale myślę, że zawdzięczam pado odpowiedzi Hax0r778 użytkownika .

John Dvorak
źródło
3

Perl - 51

(<STDIN> =~ m/'|-|ru|pu|at|pa|az|gu|mb|rc|ie|rd|ci|os|abr|mol|ven/)?printf("Italy\n"):printf("USA\n");
Hax0r778
źródło
3

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("South Dakota") // USA
> r("Puglia") // Italy
WallyWest
źródło