Crea un poliglotta regex


19

Scrivi un regex che funziona in almeno 2 regex flavours (o versioni) e abbina una stringa diversa in ogni flavour (o versione) in cui è in esecuzione.

Le stringhe da abbinare a questa sfida sono le prime parole dei nomi di codice Ubuntu, che sono elencati di seguito. La tua regex deve corrispondere dalla cima dell'elenco. Cioè, se il tuo regex funziona in 3 gusti, deve corrispondere Warty Hoarye Breezy, e non altri.

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 il tuo regex funziona in più di 26 versioni, puoi invece abbinare i numeri di versione di Ubuntu. A partire da 17.10, per ogni nuovo sapore, cambia il secondo numero in 10 se fosse 04, e incrementa il primo numero e cambia il secondo in 04 altrimenti.

In ogni aspetto, il tuo regex dovrebbe corrispondere solo alla stringa presunta e nient'altro (non limitato ai nomi di codice). Il trascinamento delle newline non ha importanza. Ciò significa che il tuo regex potrebbe abbinare solo la stringa senza la nuova riga finale, abbinare solo la stringa con la nuova riga finale, o abbinare entrambi. E non deve essere coerente in diversi gusti. Puoi supporre che l'input sia in ASCII stampabile (eccetto per la nuova riga finale, se presente).

Il tuo punteggio è (la lunghezza del tuo codice + 10) / ((numero di gusti) ^ 2). Il punteggio più basso vince.


1
Solo per verificare - con "In ogni stile, il tuo regex dovrebbe corrispondere solo alla stringa presunta e nient'altro". Questo significa che ogni regex dovrebbe corrispondere solo a un nome di versione di Ubuntu e nessuno degli altri nomi, ma può potenzialmente corrispondere ad altre non versioni stringhe di nome, o significa che il regex può corrispondere solo a quella stringa esatta e senza altre stringhe, anche se non è un nome di versione nell'elenco sopra?
Sp3000,

@ Sp3000 Dovrebbe corrispondere a quella stringa esatta e nessun'altra stringa.
jimmy23013,

Risposte:


24

87 byte, 5 sapori, (87 + 10) / 25 = 3.88

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

Sono andato con i sapori facili da testare per ora, che sono:

La struttura generale è ^((...)y|...)$, cioè fattorizzare i finali ye aggiungere ancore.

Warty (PCRE)

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

In PCRE e Ruby, [[:word:]]c'è una classe di caratteri POSIX che corrisponde a un carattere di parola - in altri gusti si ottiene una [[:word:]classe di caratteri quindi letterale &&], il che fallisce l' (?=W)asserzione. Per far fallire Ruby, &&viene utilizzato per intersecare la classe POSIX con nulla, mentre in PCRE &&non ha alcun significato speciale.

Hoary (Javascript)

Ho(?=a)\ar

Per qualsiasi motivo, Javascript è l'unico sapore fuori dal gruppo in cui \aè letterale a- in altri gusti corrisponde al carattere campana (ASCII 7).

Breezy (Python)

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

In Python e Javascript, \zè letterale z- negli altri gusti è equivalente alla $fine dell'ancoraggio della stringa. Per far fallire Javascript usiamo la classe char []e], che è una classe char vuota []quindi letterale e]in Javascript, e una classe []e]a due caratteri in Python.

Dapper (.NET)

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

In .NET, [D-[E]]è una differenza di set, rimuovendo il set [E]da [D]. In PCRE, Javascript e Python, abbiamo la classe [D-[E]quindi letterale ]. Ruby è un po 'diverso, ma per qualche motivo analizza come una classe [D-[E]]che corrisponde solo Ee devo ancora capire perché ...

Edgy (Ruby)

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

Ruby consente le classi char all'interno delle classi char, quindi [[d]]è effettivamente equivalente [d]o giusto d. Negli altri gusti, abbiamo [[d]quindi un valore letterale ].

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.