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
, P
itp, 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. e
Modyfikator 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.
źródło
\b
dopasowaniahello
( granica słowa) (na początku i na końcu), ale nie pasuje(^,^)
”.Odpowiedzi:
PCRE.NET,3532 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.
źródło
PCRE,
1514 bajtówSkała:
B
Papier:
\b$
Nożyczki:
b|B.
Jaszczurka:
\B.
Spock:
^\w
źródło
Q
(jedno rozwiązanie 14b istnieje w Lizard = `\ Q \`, potem reszta podobna do twojej), ale absolutnie bezskutecznie.żadnych fantazyjnych funkcji,
3530 bajtów5 bajtów zapisanych przez pomysł Neila, który wykorzystuje to, czego
]
nie potrzebuje\
.Działa to na przykład z
re
modułem python .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.źródło
R='[LSR]]'
itd.This works with python's re
cóż, Python powinien być prawdopodobnie wtedy nagłówkiemPCRE,
2019Skała
Papier
Nożyczki
Spock
Jaszczurka
źródło
20 bajtów
źródło
JavaScript, 45 bajtów
Kolejne trywialne rozwiązanie.
źródło
POSIX,
5045 bajtówMoż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!
źródło
PCRE, 65 bajtów
To naprawdę trywialne rozwiązanie - i wcale nie bardzo sprytne - ale spróbuję go zagrać w golfa.
V:
L:
S:
P:
R:
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.
źródło
.NET, 50 bajtów
W takiej kolejności są
R, P, S, L, V
.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.źródło
Vanilla RE, 40 znaków
Nie jest to najbardziej zwięzłe lub eleganckie rozwiązanie, ale ma przyjemną quasi-semantyczną strukturę wizualną!
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
źródło
POSIX, 35 bajtów
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ę.
źródło