Regex Golf: Регіони Італії проти США


23

У нас вже є мета-регекс-гольф , натхненний коміксом xkcd

авторські права 2013 р. Рандалл Манро

Але і цей гольф-регекс теж виглядає веселим! Я хочу розрізняти штати США та регіони Італії. Чому? Я громадянин обох країн, і у мене завжди виникають проблеми з цим * .

Регіони Італії є

Abruzzo, Valle d'Aosta, Puglia, Basilicata, Calabria, Campania, Emilia-Romagna, Friuli-Venezia Giulia, Lazio, Liguria, Lombardia, Marche, Molise, Piemonte, Sardegna, Sicilia, Trentino-Alto Adige/Südtirol, Toscana, Umbria, Veneto

і штати США є

Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin, Wyoming

Ваше завдання - написати програму, яка відрізняє ці списки регулярним виразом. Це нова гра, тож ось

Правила

  • Розмежування списків повинно здійснюватися за допомогою одного відповідного регулярного виразу.
  • Ваш бал - це довжина цього регулярного виразу, менший - кращий.

Щоб було зрозуміло: усі роботи повинні виконуватися регулярним виразом - ні фільтрування, ні заміни, ні нічого ... навіть якщо це також робиться з регулярними виразами. Тобто, вхід повинен бути переданий безпосередньо у регулярний вираз, і лише пізніша відповідь (відповідність / не збіг) може бути використана пізнішими частинами коду. Вхід ніколи не повинен перевірятись і не змінювати нічого, крім відповідного виразу. Виняток : їсти новий рядок з чимось схожим на Рубі - chompце добре.

Ваша програма повинна взяти один запис (необов'язково після цього \nабо EOFякщо це полегшить ситуацію) з будь-якого списку зі stdin та роздрукувати, щоб викреслити назву цього списку. У цьому випадку наші списки називаються Italyі USA.

Щоб перевірити свій код, просто запустіть через нього обидва списки. Поведінка може бути невизначеною для рядків, які не зустрічаються у списку.

Оцінка питань

Це, можливо, доведеться робити на основі мови. У Перлі,

m/foobarbaz/

є відповідним регулярним виразом. Однак у Python

import re
re.compile('foobarbaz')

робить те саме. Ми б не рахували лапок для Python, тому я кажу, що ми не рахуємо m/фінал /в Perl. В обох мовах вищезазначені повинні отримувати оцінку 9.

Для уточнення точки, піднятої Абхіджітом , фактична довжина відповідного виразу - це оцінка, навіть якщо ви створюєте її динамічно. Наприклад, якщо ви знайшли магічний вираз m,

n="foo(bar|baz)"
m=n+n

тоді ви не повинні повідомляти про оцінку 12: mмає довжину 24. І щоб бути надзвичайно зрозумілим, генерований регулярний вираз не може залежати від введення. Це було б читанням введення, перш ніж передати його в регулярний вираз.

Приклад сесії

input> Calabria
Italy
input> New Hampshire
USA
input> Washington
USA
input> Puglia
Italy

* Власне, це брехня. У мене з цим взагалі ніколи не було проблем.


Чи можете ви пояснити, що ви маєте на увазі під "ні фільтруванням, ні замінами, ні з чим ... навіть якщо це також робиться з регулярними виразами". Просто для уточнення, чи означає фільтрацію, заміну списку штатів / регіонів чи фокус ширший?
Абхіджіт

@Abhijit відредаговано. Це зрозуміліше?
виставка


1
"Поведінка може бути невизначеною для рядків, які не зустрічаються у списку." це правило порушено : воно дозволяє повернутись USAу разі такої рядки, отже, вам просто доведеться перевірити італійські регіони та повернутись в USAіншому випадку.
o0 '.

1
@boothby добре, ні, це проста логіка: це, по суті, прохання лише повторного позначення італійських регіонів, але без необхідності викладене набагато складніше. Весь пункт про американських державах абсолютно не має відношення до власне питання запитав, завдяки цій помилку. Це також робить питання набагато менш цікавим.
o0 '.

Відповіді:


10

Perl - 51 36 байт (для регулярного вираження)

print<>=~/.A|ise|net|te|z.o|[cp]a|[lr]ia|r[cd]/?"Italy
":"USA
"

Нічого особливого, але може також розмістити його, оскільки воно відрізняється від інших 51 байт.

Або ж скоротити моє і без того коротке рішення на 15 байт. Це зараз перемагає, я думаю.


7

Перл, 40 ч

Підходити до цього з іншого напрямку, тобто узгодження штатів США:

[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b

Єдиною особливістю Perl / PCRE в регулярному виразі є \bслово якорного слова, яке я використав замість $кінцевого якоря, щоб він відповідав "Південна Кароліна".

Ось повторне вирівнювання в одноколірному Perl для тестування:

perl -nE 'say /[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b/ ? "USA" : "Italy"'

Це більш гофрований тестовий джгут: perl -pe '$ _ = / re /? "США \ n": "Італія \ n"'
Псевдонім

3
@ Псевдонім: мех. Поки він не враховується в балах, він може також читати його.
Ільмарі Каронен

5

Рубі (звичайний регулярний вираз), 44

$_ = gets.chomp
puts /'|-|(([^gn]i|gn|at)a|[hst]e|to|zo)$|To|La|pa/ ? "Italy" : "USA"

Знаєш, що? Чутливість до регістру - найкращий якір для початківців.

Я не впевнений, але я думаю , що я зобов'язаний paдо відповіді Hax0r778 в .


3

Perl - 51

(<STDIN> =~ m/'|-|ru|pu|at|pa|az|gu|mb|rc|ie|rd|ci|os|abr|mol|ven/)?printf("Italy\n"):printf("USA\n");

3

JavaScript 42

alert(/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(prompt())?"Italy":"USA")

Я спочатку збирався розробити це зі сторони США, тому що усунення KWXY зі списку США позбавляє багатьох штатів ... Але в Італії це було подолано добрими 17 символами ...

Якщо ми йдемо з позначенням жирової стрілки, ми можемо звести це до простої функції зі змінною віддачею.

r=s=>/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(s)?"Italy":"USA"

> r("South Dakota") // USA
> r("Puglia") // Italy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.