Regex, papier, nożyczki, jaszczurka, spock

81

Rozgrzewka: Regex, papier, nożyczki

To wyzwanie, które pierwotnie chciałem postawić, zanim zdałem sobie sprawę, że istnieje bardzo krótkie rozwiązanie. Niemniej jednak zastanawianie się nad przygotowaniem do rzeczywistego wyzwania poniżej może być interesującym problemem.

Napisz trzy wyrażenia regularne R , P i S, tak aby pasowały do ​​siebie w cykliczny sposób: Rock, Paper, Scissors. W szczególności R odpowiada S , S odpowiada P a P odpowiada R , a R nie pasuje P , S nie pasuje R i P nie pasuje S . Oto przydatny stolik:

Regex   Matches   Doesn't match
R       S         P
P       R         S
S       P         R

Nie ma znaczenia, co R , P i S robią na innych wejściach, w tym na nich samych.

W tym przypadku dopasowanie oznacza tylko, że niektóre (prawdopodobnie puste) podłańcuchy danych wejściowych są dopasowane. Dopasowanie nie musi obejmować całego wkładu.

Wyzwanie: Regex, papier, nożyczki, jaszczurka, spock

W tym wyzwaniu rozwiążesz trudniejszą wersję powyższego problemu, opartą na wariancie RPS Rock, Paper, Scissors, Lizard, Spock (spopularyzowany przez The Big Bang Theory ). W RPSLV istnieje pięć różnych symboli, które biją się w dwóch cyklach:

  • Skała → Nożyczki → Jaszczurka → Papier → Spock → Skała
  • Skała → Jaszczurka → Spock → Nożyczki → Papier → Skała

Powinieneś napisać pięć wyrażeń regularnych R , P , S , L i V, które naśladują tę strukturę, gdy są sobie przekazywane jako dane wejściowe. Oto odpowiednia tabela:

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

Żeby było jasne, należy nie pasuje łańcuch R, Pitp, ale inne Wyrażenia regularne. Na przykład, jeśli wyrażenie regularne R jest ^\w$na przykład, wtedy P i V muszą być zgodne łańcuch ^\w$, a S i L nie.

Ponownie, dopasowanie oznacza po prostu, że co najmniej jeden (być może pusty) podciąg wejściowy jest dopasowany. Dopasowanie nie musi obejmować całego wkładu. Na przykład \b(granica słowa) pasuje hello(na początku i na końcu), ale nie pasuje (^,^).

Możesz użyć dowolnego smaku wyrażenia regularnego, ale proszę podać wybór w swojej odpowiedzi i, jeśli to możliwe, podać link do testera online dla wybranego smaku. Nie możesz używać żadnych funkcji wyrażenia regularnego, które pozwalają wywoływać kod w języku macierzystym smaku (np. eModyfikator smaku Perla ).

Ograniczniki (podobne /regex/) nie są uwzględniane w wyrażeniu regularnym, gdy są podawane jako dane wejściowe do innego, i nie można używać modyfikatorów, które znajdują się poza wyrażeniem regularnym. Niektóre smaki nadal pozwalają używać modyfikatorów z wbudowaną składnią, takich jak (?s).

Twój wynik to suma długości pięciu wyrażeń regularnych w bajtach. Niższe jest lepsze.

Okazuje się, że to dużo prostsze, aby znaleźć się roztwór roboczy tego problemu niż może się wydawać na pierwszy, ale mam nadzieję, że znalezienie optymalnego rozwiązania jest dość trudne.

Martin Ender
źródło
Czy powiedzmy, że R musi pasować do całego wyrażenia regularnego S lub podłańcucha S, pod warunkiem, że nie pasuje do żadnych podciągów P lub V?
Okx,
Dopasowanie @Okx oznacza po prostu, że dopasowany jest co najmniej jeden (ewentualnie pusty) podciąg wejściowy. Dopasowanie nie musi obejmować całego wejścia. Na przykład \bdopasowania hello( granica słowa) (na początku i na końcu), ale nie pasuje (^,^)”.
Martin Ender
1
Przypuszczalnie nie ma znaczenia, czy wyrażenie regularne pasuje do siebie?
Brilliand
@Brilliand Correct.
Martin Ender
1
Świetna łamigłówka. Stworzyłem tutaj interaktywną wersję, jeśli ktoś jest zainteresowany: shark.fish/rock-paper-scissors
shark.dp

Odpowiedzi:

45

PCRE .NET, 35 32 bajtów

-3 bajty dzięki Martinowi Enderowi

Skała:

([*?]$)

Papier:

[)$]$+

Nożyczki:

[+?]$.*

Jaszczurka:

[+$]$.?

Spock:

[*)]$

Chodzi tutaj o dopasowanie znaków na końcu innych wyrażeń regularnych, które są zastrzeżonymi znakami wyrażenia regularnego, ale przestają być traktowane jako takie, gdy znajdują się w klasie znaków.

Business Cat
źródło
1
Dobra, wygrywasz: P
ETHproductions
3
Podstępne użycie umieszczania rzeczy po EOL „$”, które stają się ignorowane, gdy są aktywnie używane i pasowalne, gdy są używane pasywnie
Stilez
44

PCRE, 15 14 bajtów

Skała:
B

Papier:
\b$

Nożyczki:
b|B.

Jaszczurka:
\B.

Spock:
^\w

Anders Kaseorg
źródło
4
Bardzo imponujące.
Eric Duminil,
Nie do pobicia! Grzebałem w Rock = Q(jedno rozwiązanie 14b istnieje w Lizard = `\ Q \`, potem reszta podobna do twojej), ale absolutnie bezskutecznie.
jaytea
40

żadnych fantazyjnych funkcji, 35 30 bajtów

5 bajtów zapisanych przez pomysł Neila, który wykorzystuje to, czego ]nie potrzebuje \.

Działa to na przykład z remodułem python .

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

Wyszukuje ]poprzednią literę wskazującą, która to reguła.

Użyta poprzednia wersja R='\[[RSL]'itp.

Wcześniejsza próba z wynikiem 40 używała R='[SL]x|Rx'itp.

Christian Sievers
źródło
1
Zaoszczędź 5 bajtów, odwracając wszystko: R='[LSR]]'itd.
Neil
@Neil To świetna poprawa, dzięki!
Christian Sievers,
This works with python's recóż, Python powinien być prawdopodobnie wtedy nagłówkiem
cat
1
@cat Napisałem również „na przykład”, całe zdanie jest po prostu powiedzeniem czegoś konkretnego, co faktycznie próbowałem. Wydaje mi się, że mógłbym powiedzieć POSIX tak jak niektórzy inni, ale myślę, że mój nagłówek jest całkiem poprawny.
Christian Sievers
26

PCRE, 20 19

Skała

W

Papier

^\w

Nożyczki

^\W

Spock

w?\x57$

Jaszczurka

[w]W?
TwiNight
źródło
21

20 bajtów

R = 'R|VP'
L = 'L|RS'
V = 'V|LP'
S = 'S|RV'
P = 'P|LS'
emulbreh
źródło
Och wow, to może być takie proste!
Christian Sievers,
To jest piękne.
Eric Duminil,
8

JavaScript, 45 bajtów

Kolejne trywialne rozwiązanie.

R:
^R|^.[SL]
P:
^P|^.[RV]
S:
^S|^.[PL]
L:
^L|^.[PV]
V:
^V|^.[SR]
dzaima
źródło
Och, właśnie zdałem sobie sprawę, że moja odpowiedź jest dłuższą / podobną wersją. Chcesz, żebym ją usunął?
TheLethalCoder
4
@TheLethalCoder Wszystkie odpowiedzi są obecnie tylko dłuższymi / krótszymi wersjami: p
dzaima
1
Przypuszczam, haha ​​...
TheLethalCoder
5

POSIX, 50 45 bajtów

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

Można to zrobić krócej, ale wykorzystano sztuczkę (ukryj mecze po $), więc szukam innego sposobu

Pierwsze 5 znaków każdego łańcucha jest ignorowanych podczas dopasowywania. Więc efektywny ciąg docelowy upraszcza tylko X? Y ?. Żadna z nich nie ma podwójnych liter, ponieważ „?” jest zwykłym char, więc ostatnie 4 znaki używane jako wyrażenie regularne muszą się zgadzać (łańcuch zerowy). Tak więc wzory zwinięte do „zawiera 5 znaków, po których następuje litera docelowa”: co oznacza, że ​​znaki 6-9 celu muszą zawierać literę docelową (5 znak w każdym ciągu)

Aktualizacja: poniżej 35-bajtowa wersja teraz!

Stilez
źródło
Zawsze myślałem, że V nie jest tak naprawdę dla V ulcana, ale reprezentuje kształt salwatu Vulcan (który jest gestem ręki, którego używasz do reprezentowania Spocka, grając osobiście w RPSLV).
Martin Ender
W każdym razie witamy w PPCG! Ładna pierwsza odpowiedź. Podoba mi się, że odwróciłeś logikę w porównaniu do wszystkich istniejących odpowiedzi (dopasowując tylko jedną literę i umieszczając litery bijące obecny regex w regex).
Martin Ender
Czy POSIX automatycznie zakotwicza dopasowanie na początku łańcucha? W przeciwnym razie nie możesz upuścić tych przecinków?
Martin Ender
Myślę, że to POSIX. Może być perc. Ale tak, ładnie zauważony! 5 znaków mniej!
Stilez,
4
Nie ma potrzeby konkurować z galaretką. Po prostu wybierz język, który lubisz i baw się dobrze. :)
Martin Ender
3

PCRE, 65 bajtów

To naprawdę trywialne rozwiązanie - i wcale nie bardzo sprytne - ale spróbuję go zagrać w golfa.

V:

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

L:

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

S:

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

P:

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

R:

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

Zasadniczo każde wyrażenie regularne ma „identyfikator” w postaci komentarza, który informuje pozostałe wyrażenia regularne, czy należy je dopasować, czy nie.

Okx
źródło
3

.NET, 50 bajtów

W takiej kolejności są R, P, S, L, V.

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

Działa poprzez wyszukiwanie grupy identyfikatorów (na przykład [^R]) w każdym z pozostałych wyrażeń.

Zmiana wyrażeń na ^R|\^[SL]lub podobna wydaje się działać, ale jest to nieco zbyt podobne do odpowiedzi @ dzaima, chociaż zwiększyłoby to do 45 bajtów.

TheLethalCoder
źródło
3

Vanilla RE, 40 znaków

Nie jest to najbardziej zwięzłe lub eleganckie rozwiązanie, ale ma przyjemną quasi-semantyczną strukturę wizualną!

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

Rock bije Nożyce lub jaszczurki
Papier bije Wulkany lub Rock
nożyczki biją Jaszczurki lub papier
Jaszczurki biją Papier lub Vulcan
Wulkan bije Kamienie lub nożyczki

Chris D'Amato
źródło
2

POSIX, 35 bajtów

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

Zupełnie inny sposób „ukrywania się” za symbolem początkowym / końcowym, więc czuję się z tym dobrze :) Dopasowuję się do początku, ponieważ „?” musiałby zawsze przechodzić między literą a końcem / $, jeśli zrobiono to w inny sposób.

10 bajtów mniej niż moje pierwsze rozwiązanie i koncepcyjnie proste, co jest bonusem, który lubię.

Stilez
źródło