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
Hoary
e 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.
fonte
Respostas:
87 bytes, 5 tipos, (87 + 10) / 25 = 3,88
Por agora, escolhi os sabores fáceis de testar, que são:
A estrutura geral é
^((...)y|...)$
, ou seja, fatorando os valores finaisy
e adicionando âncoras.Warty (PCRE)
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)
Por qualquer motivo, o Javascript é o único sabor do grupo em que
\a
é literala
- em outros sabores, ele corresponde ao caractere de sino (ASCII 7).Breezy (Python)
Em Python e Javascript,
\z
é literalz
- 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 literale]
em Javascript, e uma classe de dois caracteres[]e]
em Python.Dapper (.NET)
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 correspondeE
, e ainda tenho que descobrir o porquê ...Nervoso (Ruby)
Ruby permite classes char dentro de classes char, então
[[d]]
é realmente equivalente a[d]
, ou apenasd
. Nos outros sabores, temos[[d]
um literal]
.fonte