Haz un políglota regex

19

Escriba una expresión regular que funcione en al menos 2 sabores de expresiones regulares (o versiones), y combine una cadena diferente en cada sabor (o versión) en la que se está ejecutando.

Las cadenas que deben coincidir en este desafío son las primeras palabras de los nombres de código de Ubuntu, que se enumeran a continuación. Su expresión regular debe coincidir desde la parte superior de la lista. Es decir, si sus obras de expresiones regulares en 3 sabores, tiene que coincidir Warty Hoaryy Breezy, y no a otros.

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 su expresión regular funciona en más de 26 sabores, puede hacer coincidir los números de versión de Ubuntu. A partir de 17.10, para cada nuevo sabor, cambie el segundo número a 10 si era 04, incremente el primer número y cambie el segundo a 04 de lo contrario.

En cada sabor, su expresión regular debe coincidir solo con la cadena supuesta y nada más (no limitado a los nombres de código). Las últimas líneas no importan. Eso significa que su expresión regular podría coincidir solo con la cadena sin la nueva línea final, coincidir solo con la cadena con la nueva línea final o con ambas. Y no tiene que ser consistente en diferentes sabores. Puede suponer que la entrada está en ASCII imprimible (a excepción de la nueva línea final, si hay una).

Su puntaje es (la longitud de su código + 10) / ((número de sabores) ^ 2). La puntuación más baja gana.

jimmy23013
fuente
1
Solo para verificar: "En cada versión, su expresión regular debe coincidir solo con la supuesta cadena y nada más", ¿significa esto que cada expresión regular solo debe coincidir con un nombre de versión de Ubuntu y ninguno de los otros nombres, pero potencialmente puede coincidir con otros no versiones nombrar cadenas, o significa que la expresión regular solo puede coincidir con esa cadena exacta y no con otras cadenas, incluso si no es un nombre de versión en la lista anterior?
Sp3000
@ Sp3000 Debe coincidir con esa cadena exacta y no con otras cadenas.
jimmy23013

Respuestas:

24

87 bytes, 5 sabores, (87 + 10) / 25 = 3.88

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

Me he ido con los sabores fáciles de probar por ahora, que son:

La estructura general es ^((...)y|...)$, es decir, factorizar los ys finales y agregar anclajes.

Warty (PCRE)

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

En PCRE y Ruby, [[:word:]]es una clase de caracteres POSIX que coincide con un carácter de palabra; en otros sabores, obtienes una [[:word:]clase de caracteres y luego literal &&], que falla la (?=W)afirmación. Para hacer que Ruby falle, &&se usa para intersecar la clase POSIX con nada, mientras que en PCRE &&no tiene un significado especial.

Canoso (Javascript)

Ho(?=a)\ar

Por alguna razón, Javascript es el único sabor del grupo donde \aes literal a: en otros sabores, coincide con el carácter de campana (ASCII 7).

Poco ventoso (Python)

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

En Python y Javascript, \zes un literal z: en los otros sabores es equivalente al $final del anclaje de cadena. Para hacer que Javascript falle, usamos la clase char []e], que es una clase char vacía y []luego literal e]en Javascript, y una clase de dos caracteres []e]en Python.

Dapper (.NET)

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

En .NET, [D-[E]]hay una diferencia de conjunto, eliminando el conjunto [E]de [D]. En PCRE, Javascript y Python, tenemos la clase y [D-[E]luego un literal ]. Ruby es un poco diferente, pero por alguna razón se analiza como una clase [D-[E]]que solo coincide E, y todavía tengo que entender por qué ...

Nervioso (rubí)

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

Ruby permite clases de caracteres dentro de clases de caracteres, por [[d]]lo que en realidad es equivalente [d]o simplemente d. En los otros sabores, tenemos [[d]un literal ].

Sp3000
fuente