Сделайте полиглот регулярных выражений


19

Напишите регулярное выражение, которое работает как минимум в двух вариантах (или версиях) регулярных выражений, и сопоставьте разные строки в каждом варианте (или версии), в котором он работает.

Строки, которые должны быть сопоставлены в этой задаче, являются первыми словами кодовых имен Ubuntu, которые перечислены ниже. Ваше регулярное выражение должно совпадать с верхней части списка. То есть, если ваши регулярные выражения работает в 3 -х вкусах, он должен соответствовать Warty Hoaryи Breezy, а не другим.

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

Если ваше регулярное выражение работает в более чем 26 вариантах, вместо этого вы можете сопоставить номера версий Ubuntu. Начиная с 17.10, для каждого нового аромата измените второе число на 10, если оно было 04, и увеличьте первое число и измените второе на 04 в противном случае.

В каждом варианте ваше регулярное выражение должно соответствовать только предполагаемой строке и ничему другому (не ограничиваясь кодовыми именами). Замыкающие переводы не имеют значения. Это означает, что ваше регулярное выражение может либо соответствовать только строке без завершающей строки, либо совпадать только с последней строкой строки, либо совпадать с обеими. И это не должно быть последовательным в разных вкусах. Вы можете предполагать, что входные данные находятся в печатном ASCII (за исключением завершающего перевода строки, если он есть).

Ваша оценка (длина вашего кода + 10) / ((количество ароматов) ^ 2). Самый низкий балл побеждает.


1
Просто для проверки: «В каждом варианте ваше регулярное выражение должно соответствовать только предполагаемой строке и ничему другому.», Означает ли это, что каждое регулярное выражение должно соответствовать только одному имени версии Ubuntu и ни одному из других имен, но потенциально может соответствовать другим не версиям имя строки, или это означает, что регулярное выражение может соответствовать только этой точной строке и никаким другим строкам, даже если это не имя версии в списке выше?
Sp3000

@ Sp3000 Это должно соответствовать именно этой строке, а не другим строкам.
jimmy23013

Ответы:


24

87 байт, 5 ароматов, (87 + 10) / 25 = 3,88

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

На данный момент я пошел с простыми для тестирования вкусами, а именно:

Общая структура такова ^((...)y|...)$, то есть выделение конечных yсимволов и добавление якорей.

Бородавка (PCRE)

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

В PCRE и Ruby [[:word:]]- это символьный класс POSIX, соответствующий символу слова - в других вариантах вы получаете [[:word:]символьный класс, а не литерал &&], что не соответствует (?=W)утверждению. Чтобы заставить Ruby потерпеть неудачу, &&используется для пересечения класса POSIX ни с чем, тогда как в PCRE &&не имеет особого значения.

Седой (Javascript)

Ho(?=a)\ar

По какой-то причине Javascript - это единственный вариант из множества, где \aесть литерал a- в других вариантах он соответствует символу колокольчика (ASCII 7).

Бризи (Питон)

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

В Python и Javascript \zэто литерал z- в других вариантах он эквивалентен $концу строки привязки. Чтобы сделать Javascript неудачным, мы используем класс char []e], который является пустым классом char, []затем литеральным e]в Javascript, и класс с двумя символами []e]в Python.

Dapper (.NET)

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

In .NET, [D-[E]]- это разность множеств, удаляющих множество [E]из [D]. В PCRE, Javascript и Python у нас есть класс, а [D-[E]затем литерал ]. Ruby немного отличается, но по какой-то причине он анализируется как класс, [D-[E]]который только соответствует E, и мне еще предстоит выяснить, почему ...

Острый (Рубин)

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

Ruby допускает классы char внутри классов char, поэтому [[d]]фактически эквивалентен [d]или просто d. В других вариантах мы имеем [[d]буквальное значение ].

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.