Nous avons déjà un problème de méta-regex-golf inspiré par la bande dessinée xkcd
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, chomp
c'est bien.
Votre programme doit prendre une seule entrée (éventuellement suivie \n
ou EOF
si 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 Italy
et 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: m
a 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.
la source
USA
dans le cas d'une telle chaîne, il vous suffira donc de vérifier les régions italiennes, et de revenirUSA
autrement.Réponses:
Perl -
5136 octets (pour l'expression régulière)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.
la source
Perl, 40 caractères
En abordant cela dans l'autre sens, c'est-à-dire en faisant correspondre les États américains:
La seule fonctionnalité spécifique à Perl / PCRE dans l'expression rationnelle est l'
\b
ancre 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:
la source
Rubis (regex ordinaire), 44
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éponse
pa
à Hax0r778 .la source
Perl - 51
la source
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"
la source