Dans l'esprit de ce xkcd
Écrivez un programme qui joue au golf regex avec des paires de listes arbitraires. Le programme doit au moins tenter de raccourcir l'expression régulière, un programme qui ne fait que sortir /^(item1|item2|item3|item4)$/
ou similaire n'est pas autorisé.
La notation est basée sur la capacité à générer l'expression régulière la plus courte. Les listes de tests sont celles des candidats à la présidentielle américains retenus et non retenus, trouvés ici (merci @Peter). Bien sûr, le programme doit fonctionner pour toutes les listes disjointes, donc le simple retour d'une réponse pour le président ne compte pas.
regular-expression
metagolf
Manishearth
la source
la source
/^item1|atem2|item3|item4$/
a probablement une priorité inattendue (la chaîne doit commenceritem1
, conteniratem2
, conteniritem3
ou se terminer paritem4
).Réponses:
Perl (
111110122 caractères)Celui-ci utilise le module CPAN appelé
Regexp::Assemble
afin d'optimiser les expressions régulières. Parce que quel est le meilleur langage pour les expressions régulières que Perl.Aussi, version lisible, juste pour le plaisir (faite avec l'aide de
-MO=Deparse
).Exemple de sortie (j'ai fait CTRL-D après
item4
).Aussi, en bonus, j'écris l'expression régulière pour chaque mot de la question.
Aussi, liste des présidents (262 octets).
la source
Pas ma solution (évidemment je ne suis pas Peter Norvig!) Mais voici une solution de la question (légèrement modifiée) avec l'aimable autorisation de lui: http://nbviewer.ipython.org/url/norvig.com/ipython/xkcd1313.ipynb
le programme qu'il donne est le suivant (son travail, pas le mien):
où les gagnants et les perdants sont les listes des gagnants et des perdants respectivement (ou 2 listes bien sûr) voir l'article pour des explications détaillées.
la source
Ma solution écrite en Factor :
C'est le même algorithme que Norvig. Si le but est de nuire à la lisibilité, vous pouvez probablement jouer au golf avec beaucoup plus de personnages.
la source
Mon code n'est pas d'une manière très golfique et condensée, mais vous pouvez le vérifier sur https://github.com/amitayd/regexp-golf-coffeescript/ (ou spécifiquement l'algorithme sur src / regexpGolf.coffee).
Il est basé sur l'algorithme de Peter Norvig, avec deux améliorations:
(Et a également ajouté un caractère aléatoire facultatif)
Pour les ensembles de gagnants / perdants dans ce quiz, j'ai trouvé une expression régulière de 76 caractères en l'utilisant:
Plus de détails dans mon article de blog sur le portage du solveur en coffeescript .
la source