Machen Sie einen Regex-Polyglot

19

Schreiben Sie eine Regex, die in mindestens 2 Regex-Varianten (oder -Versionen) funktioniert, und passen Sie für jede Variante (oder Version), in der sie ausgeführt wird, eine andere Zeichenfolge an.

Die Zeichenfolgen, die in dieser Challenge gefunden werden müssen, sind die ersten Wörter der Ubuntu-Codenamen, die unten aufgeführt sind. Ihr regulärer Ausdruck muss oben in der Liste stehen. Das heißt, wenn Ihre Regex Werke in 3 Geschmacksrichtungen, hat es zu passen Warty Hoaryund Breezy, und andere nicht.

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

Wenn Ihre reguläre Ausdrucksweise in mehr als 26 Varianten funktioniert, können Sie stattdessen die Ubuntu-Versionsnummern verwenden. Ändern Sie ab 17.10 für jede neue Variante die zweite Nummer in 10, wenn es 04 war, und erhöhen Sie die erste Nummer und ändern Sie die zweite in 04, wenn dies nicht der Fall ist.

In jeder Variante sollte Ihr regulärer Ausdruck nur mit der angeblichen Zeichenfolge und nichts anderem übereinstimmen (nicht auf die Codenamen beschränkt). Das Nachziehen von Zeilenumbrüchen spielt keine Rolle. Das bedeutet, dass Ihre Regex entweder nur mit der Zeichenfolge ohne nachfolgende Zeilenvorschubzeile übereinstimmen kann, nur mit der Zeichenfolge mit nachfolgender Zeilenvorschubzeile oder mit beiden. Und es muss nicht in verschiedenen Geschmacksrichtungen konsistent sein. Sie können davon ausgehen, dass die Eingabe in druckbarem ASCII-Format erfolgt (mit Ausnahme der abschließenden Newline, falls vorhanden).

Ihre Punktzahl ist (die Länge Ihres Codes + 10) / ((Anzahl der Aromen) ^ 2). Die niedrigste Punktzahl gewinnt.

jimmy23013
quelle
1
Nur um zu überprüfen, ob "In jeder Variante sollte Ihr Regex nur mit dem vermeintlichen String und sonst nichts übereinstimmen." Benennen Sie Zeichenfolgen, oder bedeutet dies, dass der reguläre Ausdruck nur mit dieser exakten Zeichenfolge und keinen anderen Zeichenfolgen übereinstimmen kann, selbst wenn es sich nicht um einen Versionsnamen in der obigen Liste handelt?
Sp3000
@ Sp3000 Es sollte genau dieser Zeichenfolge entsprechen und keine anderen Zeichenfolgen.
Jimmy23013

Antworten:

24

87 Bytes, 5 Aromen, (87 + 10) / 25 = 3,88

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

Ich habe mich vorerst für die einfach zu testenden Geschmacksrichtungen entschieden, die:

Die allgemeine Struktur ist ^((...)y|...)$also das Ausklammern des Trailingy Punkte und das Hinzufügen von Ankern.

Warty (PCRE)

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

In PCRE und Ruby gibt [[:word:]]es eine POSIX-Zeichenklasse, die einem Wortzeichen entspricht. In anderen Varianten erhalten Sie eine [[:word:]Zeichenklasse als Literal &&], bei der die (?=W)Zusicherung fehlschlägt . Damit Ruby fehlschlägt, &&wird die POSIX-Klasse mit nothing geschnitten, wohingegen in PCRE&& keine besondere Bedeutung hat.

Hoary (Javascript)

Ho(?=a)\ar

Aus welchem ​​Grund auch immer, Javascript ist die einzige Variante, bei der \aes sich um eine wörtliche handelta - in anderen Varianten entspricht es dem Glockenzeichen (ASCII 7).

Breezy (Python)

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

In Python und Javascript \zist es ein Literal z- in den anderen Varianten entspricht es dem $Ende des String-Ankers. Um Javascript zum Scheitern zu bringen, verwenden wir die char-Klasse []e], die eine leere char-Klasse ist, die []dann e]in Javascript wörtlich ist , und eine Zwei-Zeichen-Klasse []e]in Python.

Dapper (.NET)

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

In .NET, [D-[E]]ist ein Satz Unterschied, Entfernen des Satzes [E]aus [D]. In PCRE, Javascript und Python haben wir die Klasse [D-[E]dann als Literal ]. Ruby ist ein bisschen anders, aber aus irgendeinem Grund wird er als eine Klasse analysiert, [D-[E]]die nur passtE , und ich muss noch herausfinden, warum ...

Edgy (Ruby)

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

Ruby erlaubt Zeichenklassen innerhalb von Zeichenklassen, [[d]]ist also tatsächlich gleichbedeutend mit [d]oder nur d. In den anderen Geschmacksrichtungen haben wir[[d] dann einen wörtlichen ].

Sp3000
quelle