É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
Hoary
et Breezy
et 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.
la source
Réponses:
87 octets, 5 saveurs, (87 + 10) / 25 = 3,88
Je suis allé avec les saveurs faciles à tester pour l'instant, qui sont:
La structure générale est
^((...)y|...)$
, c.-à-d. Factoriser lesy
s arrière et ajouter des ancres.Verruqueuse (PCRE)
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)
Pour une raison quelconque, Javascript est la seule saveur du lot où
\a
est un littérala
- dans d'autres saveurs, il correspond au caractère de cloche (ASCII 7).Breezy (Python)
En Python et Javascript,
\z
est un littéralz
- 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éralee]
en Javascript, et une classe[]e]
à deux caractères en Python.Dapper (.NET)
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 correspondE
, et je n'ai pas encore compris pourquoi ...Edgy (Ruby)
Ruby autorise les classes char à l'intérieur des classes char, donc
[[d]]
est en fait équivalent[d]
ou justed
. Dans les autres saveurs, nous avons[[d]
alors un littéral]
.la source