Зробіть регекс-поліглот


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 &&не має особливого значення.

Hoary (Javascript)

Ho(?=a)\ar

З будь-якої причини, Javascript є єдиним ароматом з групи, де \aє буквальним a- в інших ароматах він відповідає символу дзвоника (ASCII 7).

Breezy (Python)

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

У Python та Javascript \zє буквальним z- в інших ароматах він еквівалентний $кінці строкового якоря. Для того, щоб Javascript не вдався, ми використовуємо клас char []e], який є порожнім чарівним класом, []а потім буквальним e]в Javascript, і двочарговий клас []e]в Python.

Dapper (.NET)

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

В .NET, [D-[E]]є безліч різниця, видалення набору [E]з [D]. У PCRE, Javascript та Python ми маємо клас [D-[E]тоді буквальний ]. Рубі трохи інша, але чомусь вона розбирає як клас, [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.