Regex Golf: régions d'Italie contre États des États-Unis

23

Nous avons déjà un problème de méta-regex-golf inspiré par la bande dessinée xkcd

copyright 2013 Randall Munroe

Mais ce golf regex a aussi l'air amusant! Je veux faire la distinction entre les États des États-Unis et les régions d'Italie. Pourquoi? Je suis citoyen des deux pays et j'ai toujours du mal avec ça * .

Les régions d'Italie sont

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

et les États des États-Unis sont

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

Votre travail consiste à écrire un programme qui distingue ces listes avec une expression régulière. Ceci est un nouveau jeu, voici donc le

Règles

  • La distinction entre les listes doit être effectuée avec une seule expression régulière correspondante.
  • Votre score est la longueur de cette expression régulière, plus c'est petit, mieux c'est.

Pour être clair: tout le travail doit être fait par l'expression régulière - pas de filtrage, pas de remplacements, pas rien ... même si ceux-ci se font aussi avec des expressions régulières. Autrement dit, l'entrée doit être passée directement dans une expression régulière, et seule la réponse binaire (correspondance / aucune correspondance) peut être utilisée par des parties ultérieures du code. L'entrée ne doit jamais être inspectée ou modifiée par autre chose que l'expression correspondante. Exception : manger une nouvelle ligne avec quelque chose qui ressemble à Ruby, chompc'est bien.

Votre programme doit prendre une seule entrée (éventuellement suivie \nou EOFsi cela facilite les choses) de l'une ou l'autre liste de stdin, et imprimer pour stdout le nom de cette liste. Dans ce cas, nos listes sont nommées Italyet USA.

Pour tester votre code, parcourez simplement les deux listes. Le comportement peut être indéfini pour les chaînes qui n'apparaissent pas dans la liste.

Problèmes de notation

Cela pourrait devoir être fait langue par langue. En Perl,

m/foobarbaz/

est une expression régulière correspondante. Cependant, en Python,

import re
re.compile('foobarbaz')

fait la même chose. Nous ne compterions pas les citations pour Python, donc je dis que nous ne comptons pas le m/et final /en Perl. Dans les deux langues, ce qui précède devrait recevoir un score de 9.

Pour clarifier un point soulevé par Abhijit , la longueur réelle de l'expression correspondante est le score, même si vous le générez dynamiquement. Par exemple, si vous avez trouvé une expression magique m,

n="foo(bar|baz)"
m=n+n

alors vous ne devriez pas rapporter un score de 12: ma une longueur de 24. Et juste pour être très clair, l'expression régulière générée ne peut pas dépendre de l'entrée. Ce serait lire l'entrée avant de la passer dans l'expression régulière.

Exemple de session

input> Calabria
Italy
input> New Hampshire
USA
input> Washington
USA
input> Puglia
Italy

* En fait, c'est un mensonge. Je n'ai jamais eu aucun problème avec ça.

boothby
la source
Pouvez-vous expliquer ce que vous entendez par "pas de filtrage, pas de remplacements, pas rien ... même si ceux-ci se font également avec des expressions régulières". Juste pour clarifier, cela signifie-t-il un filtrage, des remplacements de la liste des états / régions ou le focus est plus large?
Abhijit
@Abhijit modifié. Est-ce plus clair?
boothby
3
@ Eliseod'Annunzio: DC n'est pas un état
Kyle Kanos
1
"Le comportement peut être indéfini pour les chaînes qui n'apparaissent pas dans la liste." cette règle est cassée : elle permet de retourner USAdans le cas d'une telle chaîne, il vous suffira donc de vérifier les régions italiennes, et de revenir USAautrement.
o0 '.
1
@boothby eh bien, non, c'est une logique simple: il s'agit simplement de demander une expression rationnelle pour correspondre aux régions italiennes, mais inutilement formulée de manière beaucoup plus compliquée. Le tout point au sujet des états américains est totalement non pertinent à la question réelle demande, grâce à ce bug. Cela rend également la question beaucoup moins intéressante.
o0 '.

Réponses:

10

Perl - 51 36 octets (pour l'expression régulière)

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

Rien de spécial, mais autant le poster, car il est différent des autres solutions à 51 octets.

Ou bien, raccourcissez ma solution déjà courte de 15 octets. Cela gagne pour l'instant, je pense.

Konrad Borowski
la source
7

Perl, 40 caractères

En abordant cela dans l'autre sens, c'est-à-dire en faisant correspondre les États américains:

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

La seule fonctionnalité spécifique à Perl / PCRE dans l'expression rationnelle est l' \bancre de limite de mot, que j'ai utilisée à la place du$ ancre de fin de chaîne pour la faire correspondre à "Caroline du Sud".

Voici l'expression rationnelle dans une ligne unique Perl pour les tests:

perl -nE 'say /[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b/ ? "USA" : "Italy"'
Ilmari Karonen
la source
Ceci est un harnais de test plus golfique: perl -pe '$ _ = / re /? "USA \ n": "Italy \ n"'
Pseudonyme
3
@ Pseudonyme: meh. Tant qu'il ne compte pas dans la partition, autant le garder lisible.
Ilmari Karonen
5

Rubis (regex ordinaire), 44

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

Vous savez quoi? La sensibilité à la casse est la meilleure ancre de début de mot.

Je ne suis pas sûr, mais je pense que je dois la réponsepa à Hax0r778 .

John Dvorak
la source
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
la source
3

JavaScript 42

alert(/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(prompt())?"Italy":"USA")

J'allais d'abord résoudre ce problème du côté des États-Unis, car l'élimination de KWXY de la liste des États-Unis enlève beaucoup d'États ... Mais l'Italie avait le dessus avec 17 bons personnages ...

Si nous optons pour la notation en flèche grasse, nous pouvons la réduire à une simple fonction avec une variable de retour.

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
la source