Регекс, папір, ножиці, ящірка, спок


81

Розминка: Regex, папір, ножиці

Це виклик, який я спочатку хотів поставити перед тим, як зрозуміти, що існує дуже коротке рішення. Тим не менш, над проблемою можна подумати над підготовкою до наступного виклику.

Напишіть три режекси R , P і S таким чином, щоб вони відповідали один одному в циклічному режимі Rock, Paper, Scissors. Зокрема, 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 роблять на будь-яких інших входах, включаючи себе.

Ось, сірник просто означає, що деякі (можливо, порожні) підрядки вводу. Матч не повинен охоплювати весь вхід.

Завдання: Regex, папір, ножиці, ящірка, спок

Для цього ви вирішите більш жорстку версію вищезазначеної проблеми на основі варіанту 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$наприклад, P і V повинні відповідати рядку ^\w$, тоді як S і L не повинні.

Знову ж таки, матч просто означає, що принаймні одна (можливо, порожня) підрядка вводу збігається. Матч не повинен охоплювати весь вхід. Наприклад, \b(слово межа) відповідає hello(на початку та в кінці), але воно не відповідає (^,^).

Ви можете використовувати будь-який аромат регексу, але, будь ласка, вкажіть вибір у своїй відповіді та, якщо можливо, наведіть посилання на онлайн-тестер для обраного аромату. Ви не можете використовувати функції регулярного вираження, які дозволяють викликати код на мові хоста flavour (наприклад, eмодифікатор Perl flavour).

Розмежувачі (на зразок /regex/) не включаються в регулярний вираз, коли їх подано як вхід до іншого, і ви не можете використовувати модифікатори, які знаходяться поза регулярним виразом. Деякі аромати все ще дозволяють використовувати модифікатори з вбудованим синтаксисом (?s).

Ваш бал - це сума довжин п’яти регулярних виразів у байтах. Нижній краще.

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


Чи, скажімо, R має відповідати цілому регексу S або підрядці S, за умови, що він не відповідає жодним підрядкам P або V?
Okx

Матч @Okx "означає лише, що принаймні одна (можливо, порожня) підрядка вводу збігається. Збіг не повинен охоплювати весь вхід. Наприклад, відповідність \b(межа межі слова) hello(на початку та в кінці), але це не відповідає (^,^)".
Мартін Ендер

1
Імовірно, не має значення, чи відповідає собі регулярний вираз?
Brilliand

@Brilliand Правильно.
Мартін Ендер

1
Чудова головоломка. Я створив тут інтерактивну версію, якщо когось цікавить: shark.fish/rock-paper-scissors
shark.dp

Відповіді:


45

PCRE .NET, 35 32 байти

-3 байти завдяки Мартіну Ендеру

Рок:

([*?]$)

Папір:

[)$]$+

Ножиці:

[+?]$.*

Ящірка:

[+$]$.?

Спок:

[*)]$

Ідея тут полягає в тому, щоб зіставити символи в кінці інших регексів, які є зарезервованими символами регулярних виразів, але перестати розглядатися як такі, коли всередині класу символів.


1
Гаразд, ви виграєте: P
ETHproductions

3
Підступне використання предметів після EOL "$", які ігноруються при активному використанні та придатні при пасивному використанні
Stilez

44

PCRE, 15 14 байт

Рок:
B

Папір:
\b$

Ножиці:
b|B.

Ящірка:
\B.

Спок:
^\w


4
Дуже вражає.
Ерік Дюмініл

Неперевершений! Я спішився з Rock = Q(одне рішення 14b існує з Lizard = `\ Q \`, тоді решта схожа на вашу), але абсолютно безрезультатно.
jaytea

40

немає фантазійних функцій, 35 30 байт

5 байт, збережених за ідеєю Ніла, який використовує те, що ]не потрібно \.

Це працює, наприклад, з reмодулем python .

R='[SLR]]'
P='[RVP]]'
S='[PLS]]'
L='[PVL]]'
V='[SRV]]'

Він шукає ]попередній лист, який вказує, яке це правило.

Використана попередня версія R='\[[RSL]' тощо

Попередня спроба з оцінкою 40 використовувала R='[SL]x|Rx'і т.д.


1
Збережіть 5 байт, перевернувши все: R='[LSR]]'тощо.
Ніл

@Neil Це велике поліпшення, дякую!
Крістіан Сіверс

This works with python's reну, мабуть, Python повинен бути заголовком тоді
кіт

1
@cat Я також писав "наприклад", ціле речення - це просто сказати щось конкретне, що я насправді намагався. Я думаю, я міг би сказати POSIX, як це робили деякі інші, але я думаю, що мій заголовок цілком правильний.
Крістіан Сіверс

26

PCRE, 20 19

Скеля

W

Папір

^\w

Ножиці

^\W

Спок

w?\x57$

Ящірка

[w]W?


8

JavaScript, 45 байт

Ще одне банальне рішення.

R:
^R|^.[SL]
P:
^P|^.[RV]
S:
^S|^.[PL]
L:
^L|^.[PV]
V:
^V|^.[SR]

О, щойно зрозумів, що моя відповідь є довшою / подібною вашою версією, хочете, щоб я її видалив?
TheLethalCoder

4
@TheLethalCoder Усі відповіді на даний момент є лише довшими / коротшими версіями один одного: p
dzaima

1
Я гадаю, ха-ха ...
TheLethalCoder

5

POSIX, 50 45 байт

Rock
.{5}RP?V?
Paper
.{5}PS?L?
Scissors
.{5}SR?V?
Lizard
.{5}LR?S?
Vulcan (Spock)
.{5}VP?L?

Можна зробити коротше, але (приховати матчі після $) трюк звик, тому я шукаю інший спосіб

Перші 5 символів кожного рядка ігноруються при зіставленні. Тож ефективний цільовий рядок спрощується до просто X? Y ?. Жодна з них не має подвійних літер, оскільки "?" є звичайним знаком, тому останні 4 символи, використовувані як регулярний вираз, повинні відповідати (null string). Таким чином, шаблони згортаються до "містить 5 символів з наступною цільовою літерою": знаки символів 6-9 цілі повинні містити цільову літеру (5-та таблиця в кожній рядку)

Оновлення: 35-байтна версія нижче!


Я завжди вважав, що V насправді не V- вулкан, а представляти форму вулканського салюту (це жест рукою, який ви використовуєте для представлення Спока, коли особисто граєте в RPSLV).
Мартін Ендер

У будь-якому випадку, ласкаво просимо до PPCG! Приємна перша відповідь. Мені подобається, що ти перевернув логіку порівняно з усіма існуючими відповідями (збіг лише однієї літери та введення літер, що б'ють поточний регулярний вираз, в регулярний вираз).
Мартін Ендер

Чи POSIX автоматично прив’язує збіг до початку рядка? Інакше ти не міг скинути ці коми?
Мартін Ендер

Я думаю, що його POSIX. Може бути ок. Але так, добре помічений! На 5 символів менше!
Stilez

4
Не потрібно конкурувати з Jelly. Просто виберіть потрібну вам мову і насолоджуйтесь. :)
Мартін Ендер

3

PCRE, 65 байт

Це дійсно тривіальне рішення - і зовсім не дуже розумне - але я спробую пограти в нього.

V:

(?#V).+[SR]\)

L:

(?#L).+[PV]\)

S:

(?#S).+[PL]\)

P:

(?#P).+[RV]\)

R:

(?#R).+[SL]\)

По суті, кожен регулярний вираз має "ідентифікатор" у вигляді коментаря, який повідомляє іншим регулярним виразам, чи слід його співпадати чи ні.


3

.NET, 50 байт

Для того, щоб вони були R, P, S, L, V.

[^R]\^[SL]
[^P]\^[RV]
[^S]\^[PL]
[^L]\^[PV]
[^V]\^[SR]

Працює, шукаючи групу ідентифікаторів (наприклад, [^R]) у кожному з інших виразів.

Зміна виразів на ^R|\^[SL]подібні або подібні, здається, працює, але тоді це занадто схоже на відповідь @ dzaima, хоча вона отримає це до 45 байт.


3

Vanilla RE, 40 символів

Не найкоротше або елегантне рішення, але має приємну квазісемантичну візуальну структуру!

[^r][sl]
[^p][vr]
[^s][lp]
[^l][pv]
[^v][rs]

Рок б'є ножиці або ящірка
папір б'є Вулкан або рок
ножиці б'є ящірка або папір
ящірка б'є папір або вулкан
вулкан б'є рок або ножиці


2

POSIX, 35 байт

Rock
R?^[LS]
Paper
P?^[RV]
Scissors
S?^[LP]
Lizard
L?^[PV]
Vulcan (Spock)
V?^[RS]

Зовсім інший спосіб "сховатися" за символом початку / кінця, тому я відчуваю себе нормально :) Я підходить для початку, оскільки "?" завжди потрібно було б переходити між літерою та кінцем / $, якби це було зроблено іншим способом.

На 10 байт менше, ніж моє перше рішення, і концептуально простий, який мені подобається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.