Faça um poliglota regex

19

Escreva uma regex que funcione em pelo menos 2 tipos (ou versões) de regex e corresponda a uma sequência diferente em cada tipo (ou versão) em que está sendo executado.

As strings a serem correspondidas neste desafio são as primeiras palavras dos nomes de código do Ubuntu, listados abaixo. Sua regex deve corresponder no topo da lista. Ou seja, se o seu regex funciona em três sabores, ele precisa corresponder Warty Hoarye Breezy, e não outros.

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
...

Se o seu regex funciona em mais de 26 tipos, você pode combinar os números de versão do Ubuntu. A partir de 17.10, para cada novo sabor, altere o segundo número para 10, se fosse 04, e aumente o primeiro número e altere o segundo para 04, caso contrário.

Em cada sabor, sua regex deve corresponder apenas à sequência suposta e nada mais (não se limitando aos nomes de código). O rastreamento de novas linhas não importa. Isso significa que sua regex pode corresponder apenas à sequência sem a nova linha à direita, corresponder apenas a sequência à nova linha à direita ou ambas. E não precisa ser consistente em diferentes sabores. Você pode assumir que a entrada está em ASCII imprimível (exceto a nova linha à direita, se houver).

Sua pontuação é (o comprimento do seu código + 10) / ((número de sabores) ^ 2). Menor pontuação ganha.

jimmy23013
fonte
11
Apenas para verificar - por "Em cada sabor, sua regex deve corresponder apenas à suposta string e nada mais.", Isso significa que cada regex deve corresponder apenas a um nome de versão do Ubuntu e a nenhum dos outros nomes, mas pode potencialmente corresponder a outra não-versão name strings, ou significa que a regex só pode corresponder a essa string exata e a nenhuma outra string, mesmo que não seja um nome de versão na lista acima?
Sp3000
@ Sp3000 Deve corresponder à sequência exata e a nenhuma outra sequência.
precisa saber é o seguinte

Respostas:

24

87 bytes, 5 tipos, (87 + 10) / 25 = 3,88

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

Por agora, escolhi os sabores fáceis de testar, que são:

A estrutura geral é ^((...)y|...)$, ou seja, fatorando os valores finais ye adicionando âncoras.

Warty (PCRE)

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

No PCRE e Ruby, [[:word:]]há uma classe de caracteres POSIX que corresponde a um caractere de palavra - em outros tipos, você obtém uma [[:word:]classe de caracteres e &&], em seguida , literal , que falha na (?=W)afirmação. Para fazer Ruby falhar, &&é usado para interceptar a classe POSIX sem nada, enquanto no PCRE &&não tem significado especial.

Hoary (Javascript)

Ho(?=a)\ar

Por qualquer motivo, o Javascript é o único sabor do grupo em que \aé literal a- em outros sabores, ele corresponde ao caractere de sino (ASCII 7).

Breezy (Python)

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

Em Python e Javascript, \zé literal z- nos outros sabores, é equivalente ao $final da âncora da string. Para fazer o Javascript falhar, usamos a classe char []e], que é uma classe char vazia []e literal e]em Javascript, e uma classe de dois caracteres []e]em Python.

Dapper (.NET)

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

Em .NET, [D-[E]]há uma diferença de conjunto, removendo o conjunto [E]de [D]. No PCRE, Javascript e Python, temos a classe e [D-[E]depois um literal ]. Ruby é um pouco diferente, mas, por alguma razão, analisa como uma classe [D-[E]]que apenas corresponde E, e ainda tenho que descobrir o porquê ...

Nervoso (Ruby)

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

Ruby permite classes char dentro de classes char, então [[d]]é realmente equivalente a [d], ou apenas d. Nos outros sabores, temos [[d]um literal ].

Sp3000
fonte