У нас вже є мета-регекс-гольф , натхненний коміксом 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
Ваше завдання - написати програму, яка відрізняє ці списки регулярним виразом. Це нова гра, тож ось
Правила
- Розмежування списків повинно здійснюватися за допомогою одного відповідного регулярного виразу.
- Ваш бал - це довжина цього регулярного виразу, менший - кращий.
Щоб було зрозуміло: усі роботи повинні виконуватися регулярним виразом - ні фільтрування, ні заміни, ні нічого ... навіть якщо це також робиться з регулярними виразами. Тобто, вхід повинен бути переданий безпосередньо у регулярний вираз, і лише пізніша відповідь (відповідність / не збіг) може бути використана пізнішими частинами коду. Вхід ніколи не повинен перевірятись і не змінювати нічого, крім відповідного виразу. Виняток : їсти новий рядок з чимось схожим на Рубі - 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
* Власне, це брехня. У мене з цим взагалі ніколи не було проблем.
USA
у разі такої рядки, отже, вам просто доведеться перевірити італійські регіони та повернутись в USA
іншому випадку.