У нас уже есть проблема с meta-regex-golf, вдохновленная комиксом xkcd
Но и этот регулярный гольф выглядит весело! Я хочу провести различие между штатами США и регионами Италии. Зачем? Я гражданин обеих стран, и у меня всегда есть проблемы с этим * .
Регионы Италии
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
* На самом деле, это ложь. У меня никогда не было проблем с этим вообще.
USA
в случае такой строки, поэтому вам просто нужно проверить итальянские регионы и вернуться в USA
противном случае.