Faire un polyglotte regex

19

Écrivez une expression régulière qui fonctionne dans au moins 2 versions (ou versions) d'expressions régulières, et faites correspondre une chaîne différente dans chaque version (ou version) dans laquelle elle s'exécute.

Les chaînes à associer dans ce défi sont les premiers mots des noms de code Ubuntu, qui sont répertoriés ci-dessous. Votre expression régulière doit correspondre en haut de la liste. Autrement dit, si votre regex fonctionne en 3 saveurs, il doit correspondre Warty Hoaryet Breezyet pas d'autres.

Warty
Hoary
Breezy
Dapper
Edgy
Feisty
Gutsy
Hardy
Intrepid
Jaunty
Karmic
Lucid
Maverick
Natty
Oneiric
Precise
Quantal
Raring
Saucy
Trusty
Utopic
Vivid
Wily
Xenial
Yakkety
Zesty
17.10
18.04
18.10
19.04
19.10
...

Si votre regex fonctionne dans plus de 26 versions, vous pouvez plutôt faire correspondre les numéros de version d'Ubuntu. À partir de 17.10, pour chaque nouvelle saveur, changez le deuxième nombre en 10 s'il était 04, et incrémentez le premier nombre et changez le second en 04 sinon.

Dans chaque saveur, votre expression régulière ne doit correspondre qu'à la chaîne supposée et à rien d'autre (non limité aux noms de code). La fin des nouvelles lignes n'a pas d'importance. Cela signifie que votre expression régulière peut correspondre uniquement à la chaîne sans la nouvelle ligne de fin, correspondre uniquement à la chaîne avec la nouvelle ligne de fin ou correspondre aux deux. Et il n'a pas besoin d'être cohérent dans différentes saveurs. Vous pouvez supposer que l'entrée est en ASCII imprimable (sauf pour la nouvelle ligne de fin, s'il y en a une).

Votre score est (la longueur de votre code + 10) / ((nombre de saveurs) ^ 2). Le score le plus bas l'emporte.

jimmy23013
la source
1
Juste pour vérifier - par "Dans chaque saveur, votre expression régulière ne doit correspondre qu'à la chaîne supposée et à rien d'autre.", Cela signifie-t-il que chaque expression régulière ne doit correspondre qu'à un nom de version Ubuntu et à aucun des autres noms mais peut potentiellement correspondre à une autre non-version nom de chaînes, ou cela signifie-t-il que l'expression régulière ne peut correspondre qu'à cette chaîne exacte et à aucune autre chaîne, même si ce n'est pas un nom de version dans la liste ci-dessus?
Sp3000
@ Sp3000 Il doit correspondre à cette chaîne exacte et à aucune autre chaîne.
jimmy23013

Réponses:

24

87 octets, 5 saveurs, (87 + 10) / 25 = 3,88

^(((?=W)[[:word:]&&]art|Ho(?=a)\ar|Bre(?=ez)[]e]\z|E(?=dg)[[d]]g)y|(?=Da)[D-[E]]apper)$

Je suis allé avec les saveurs faciles à tester pour l'instant, qui sont:

La structure générale est ^((...)y|...)$, c.-à-d. Factoriser les ys arrière et ajouter des ancres.

Verruqueuse (PCRE)

(?=W)[[:word:]&&]art

Dans PCRE et Ruby, [[:word:]]est une classe de caractères POSIX correspondant à un caractère de mot - dans d'autres versions, vous obtenez une [[:word:]classe de caractères puis littérale &&], ce qui échoue à l' (?=W)assertion. Pour faire échouer Ruby, &&est utilisé pour couper la classe POSIX avec rien, alors que dans PCRE &&n'a pas de signification particulière.

Hoary (Javascript)

Ho(?=a)\ar

Pour une raison quelconque, Javascript est la seule saveur du lot où \aest un littéral a- dans d'autres saveurs, il correspond au caractère de cloche (ASCII 7).

Breezy (Python)

Bre(?=ez)[]e]\z

En Python et Javascript, \zest un littéral z- dans les autres versions, il équivaut à la $fin de l'ancre de chaîne. Pour faire échouer Javascript, nous utilisons la classe char []e], qui est une classe char vide []puis littérale e]en Javascript, et une classe []e]à deux caractères en Python.

Dapper (.NET)

(?=Da)[D-[E]]apper

Dans .NET, [D-[E]]est une différence de jeu, en supprimant l'ensemble [E]de [D]. En PCRE, Javascript et Python, nous avons la classe [D-[E]puis un littéral ]. Ruby est un peu différent, mais pour une raison quelconque, il est analysé comme une classe [D-[E]]qui ne correspond E, et je n'ai pas encore compris pourquoi ...

Edgy (Ruby)

E(?=dg)[[d]]g

Ruby autorise les classes char à l'intérieur des classes char, donc [[d]]est en fait équivalent [d]ou juste d. Dans les autres saveurs, nous avons [[d]alors un littéral ].

Sp3000
la source