Регекс Гольф: Регионы Италии против штатов США


23

У нас уже есть проблема с meta-regex-golf, вдохновленная комиксом xkcd

Copyright 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

Ваша задача - написать программу, которая бы отличала эти списки регулярным выражением. Это новая игра, так что вот

правила

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

Чтобы было ясно: вся работа должна выполняться с помощью регулярного выражения - без фильтрации, без замен, без ничего ... даже если это также делается с помощью регулярных выражений. То есть входные данные должны быть переданы непосредственно в регулярное выражение, и только двоичный ответ (совпадение / отсутствие совпадения) может использоваться более поздними частями кода. Входные данные никогда не должны проверяться или изменяться чем-либо, кроме соответствующего выражения. Исключение : есть новая строка с чем-то похожим на Ruby's chomp.

Ваша программа должна взять одну запись (опционально сопровождаемую \nили, EOFесли это облегчает задачу) из любого списка из stdin, и вывести на стандартный вывод название этого списка. В этом случае наши списки названы Italyи USA.

Чтобы проверить свой код, просто запустите оба списка. Поведение может быть неопределенным для строк, которых нет в списке.

Вопросы скоринга

Это, возможно, должно быть сделано на основе языка за языком. В Perl

m/foobarbaz/

совпадающее регулярное выражение. Тем не менее, в Python,

import re
re.compile('foobarbaz')

делает то же самое. Мы не будем считать кавычки для Python, поэтому я говорю, что мы не учитываем m/финал и финал /в Perl. На обоих языках выше должны получить оценку 9.

Чтобы прояснить вопрос, поднятый Abhijit , фактическая длина совпадающего выражения - это оценка, даже если вы генерируете ее динамически. Например, если вы нашли магическое выражение 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 отредактировано. Это понятнее?
Boothby

3
@ Eliseod'Annunzio: DC не штат
Кайл Канос

1
«Поведение может быть неопределенным для строк, которых нет в списке». это правило нарушено : оно позволяет вернуться USAв случае такой строки, поэтому вам просто нужно проверить итальянские регионы и вернуться в USAпротивном случае.
о0 '.

1
@boothby, ну, нет, это простая логика: в основном он запрашивает только регулярное выражение, чтобы сопоставить итальянские регионы, но излишне сложным образом формулируется. Весь пункт о американских государствах совершенно не имеет отношения к собственно вопрос спросил, благодаря этой ошибке. Это также делает вопрос гораздо менее интересным.
о0 '.

Ответы:


10

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

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

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

Или, в качестве альтернативы, сократите мое уже короткое решение на 15 байт. Я думаю, сейчас это выигрывает.


7

Perl, 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 /? "USA \ 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.