Разминка: Regex, бумага, ножницы
Это задача, которую я изначально хотел опубликовать, прежде чем понял, что существует какое-то очень короткое решение. Тем не менее, это может быть интересной проблемой для размышления при подготовке к реальной задаче ниже.
Напишите три регулярных выражения R , P и S так , чтобы они совпадали друг с другом циклическим способом «камень, бумага, ножницы». В частности, R соответствует S , S соответствует Р и Р соответствует R , но R не соответствует P , S не соответствует R и Р не совпадает с S . Вот удобный столик:
Regex Matches Doesn't match
R S P
P R S
S P R
Неважно, что R , P и S делают на любых других входах, включая себя.
Здесь match просто означает, что некоторая (возможно, пустая) подстрока ввода совпадает. Совпадение не должно охватывать весь ввод.
Задача: регулярное выражение, бумага, ножницы, ящерица, спок
Для этой задачи вы решите более сложную версию вышеупомянутой проблемы, основанную на варианте RPS «Рок, бумага, ножницы, ящерица, спок» (популяризированный в теории большого взрыва ). В RPSLV есть пять разных символов, которые бьют друг друга в двух циклах:
- Камень → Ножницы → Ящерица → Бумага → Спок → Камень
- Камень → Ящерица → Спок → Ножницы → Бумага → Камень
Вы должны написать пять регулярных выражений R , P , S , L и V, которые имитируют эту структуру, когда передаются друг другу в качестве входных данных. Вот соответствующая таблица:
Regex Matches Doesn't match
R L, S V, P
L V, P S, R
V S, R P, L
S P, L R, V
P R, V L, S
Просто чтобы быть ясно, вы должны не соответствовать строке R
, P
и т.д., но и другие регулярные выражения. Например , если ваш регулярное выражение R является ^\w$
, например, то Р и V должны совпадать со строкой ^\w$
, в то время как S и L не должны.
Опять же, совпадение просто означает, что хотя бы одна (возможно, пустая) подстрока ввода совпадает. Совпадение не должно охватывать весь ввод. Например \b
(граница слова) соответствует hello
(в начале и в конце), но не соответствует (^,^)
.
Вы можете использовать любой аромат regex, но, пожалуйста, укажите свой выбор в своем ответе и, если возможно, предоставьте ссылку на онлайн-тестер для выбранного вкуса. Вы не можете использовать какие-либо функции регулярных выражений, которые позволяют вам вызывать код на главном языке flavour (например, e
модификатор Perl flavour ).
Разделители (например /regex/
) не включаются в регулярное выражение, если они передаются как входные данные для другого, и вы не можете использовать модификаторы, которые находятся за пределами регулярного выражения. Некоторые разновидности все еще позволяют использовать модификаторы со встроенным синтаксисом, например (?s)
.
Ваша оценка - это сумма длин пяти регулярных выражений в байтах. Ниже - лучше.
Оказывается, что гораздо проще найти в рабочее решение этой проблемы , чем это может показаться на первый, но я надеюсь , что найти оптимальное решение довольно сложно.
\b
совпадения hello
( границы слова) (в начале и в конце), но это не соответствует (^,^)
. "