W zręcznościowej wersji gry Pac-Man zjada pac-kropki. Jednak w tym wyzwaniu jest głodny znaków alfanumerycznych i interpunkcji w łańcuchu.
Twoim zadaniem jest stworzenie funkcji, która karmi Pac-Mana sznurkiem, ocenia, czy może go zjeść, czy nie, i zwraca łańcuch z lokalizacją Pac-Mana w nim.
Pac-Man ( <
) zjada postacie od lewej do prawej, pozostawiając podkreślenie lub miejsce dla każdej postaci, gdy idzie, a jego celem jest przejście od pierwszej pozycji-1 do ostatniej pozycji + 1:
1. <Pac
2. _<ac
3. __<c
4. ___<
Jednak naturalny wróg Pac-Mana, duch, zatrzyma go, jeśli napotka jedną z liter w słowie „GHOST” (bez rozróżniania wielkości liter). Twoja funkcja powinna zwrócić ciąg z lokalizacją Pac-Mana, gdy napotka on ghost
postać:
1. <No!
2. _<o!
Jedyną rzeczą, która może pokonać ducha, jest pocisk mocy. Jeśli Pac-Man dojdzie do litery w słowie „PELLET” (również bez rozróżniania wielkości liter) przed przyjściem do ducha, zje ducha i będzie się poruszał, a ten pellet zostanie zużyty. Pellety mocy mogą się kumulować (tzn. W ppgg
obu duchach zostaną zjedzone). Znak T istnieje zarówno jako duch, jak i granulka, więc można go zignorować (traktować jak każdą inną literę, jak a
).
1. <Pop
2. _<op
3. __<p
4. ___<
W celu dalszego wyjaśnienia w ciągu „Pac-Man przegrywa tutaj” następują następujące operacje:
P <P, +1 Pellet (1 pellet)
a <a
c <c
- <-
M <M
a <a
n <n
<[space]
l <l, +1 Pellet (2 pellets)
o <o, -1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
e <e, +1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
<[space]
h <h, ghost wins, returns
e
r
e
Przykłady
Input: Pacman wins!
Output: ____________<
Input: Pacman loses wah-wah :(
Output: _______________<h-wah :(
Input: PELLET PELLET GHOST
Output: ___________________<
Input: Hello World!
Output: <Hello World!
Input: <_!@12<_<_<
Output: ___________<
To jest golf golfowy - najniższy wynik w bajtach wygrywa.
źródło
<
symbol ...Odpowiedzi:
Galaretka,
3433 bajtówWypróbuj online!
Myślę, że w końcu zaczynam rozumieć Jelly. Czuje się trochę przerażająco.
źródło
Siatkówka ,
5538 bajtówWypróbuj online! (Pierwszy wiersz pozwala na uruchomienie kilku przypadków testowych jednocześnie.)
Wyjaśnienie
Problem polega przede wszystkim na znalezieniu najdłuższego prefiksu, który nie ma niedopasowanego nawiasu zamykającego. Oprócz tego, że możemy skorzystać z jednego
e
,l
lubp
w miejscu(
i albog
,h
,o
lubs
w miejscu)
.Dlatego to rozwiązanie jest prawie podręcznikowym przykładem grup bilansujących. Nie będę szczegółowo omawiał ich działania, ponieważ ten kod jest zasadniczo taki sam, jak standardowy przykład, który można przeczytać w mojej odpowiedzi SO dotyczącej grup bilansujących .
Cały program jest zatem pojedynczym podstawieniem wyrażenia regularnego.
i
Aktywuje bez uwzględniania wielkości liter. Następnie albo dopasowujemy pellet[elp]
i zwiększamy licznik głębokości (w postaci stosu przechwytywania grupy2
), albo dopasowujemy coś, co nie jest duchem,[ghos]
lub dopasowujemy ducha.
i zmniejszamy licznik głębokości, wyskakując ze stosu2
. Oczywiście w zasadzie pozwala to na dopasowanie pelletu z[^ghos]
sekcją lub nie-ducha z.
sekcją, ale dzięki zachłannemu dopasowaniu i sposobowi powrotu wyrażenia regularnego silnik regex nigdy nie próbuje tych możliwości.Podstawienie wykorzystuje następnie dwie cechy
$*
charakterystyczne dla siatkówki: powtarza znak po prawej stronie tyle razy, ile określa token po lewej stronie. Tym tokenem jest$.&
długość całego meczu. Oznacza to po prostu, że zamieniamy każdą postać w meczu na_
. Następnie dodajemy również<
do tych podkreślników. Część wejściowa, która nie jest zjedzona, po prostu pozostaje niezmieniona przez substytucję.źródło
Python 2,
114113108 bajtówźródło
None
, a nie odpowiedź. A jak liczyć 107? Liczę 110.Python 2, 89 bajtów
Czasami moja uparta determinacja, aby uczynić Python językiem funkcjonalnym, ma swoje zalety.
(Nieznacznie) nie golfił:
Tworzy wynikowy ciąg za pomocą rekurencji. Aktualizacja
l
(dla „żyć”) dodaje 1 dla pelletów (True - False == 1
), odejmuje 1 dla duchów (False - True == -1
) i dodaje 0 dla każdej innej postaci. Dodaje również 0, gdys
jest pustym ciągiem, dzięki krojeniu Pythona i temu'' in any_str == True
, że pellet i duch anulują się.Instrukcja return używa
test and b or a
zamiasta if test else b
jednego bajtu. Podstawowy przypadek rekurencji występuje, gdy kończy się sznurek lub Pac-Man skończy się granulkami, zwięźle przedstawionymi jakos*p
, co równa się''
(a zatem ocenia na fałsz), gdy którykolwieks == ''
lubp == 0
.źródło
C #,
269256232212211 bajtówPierwszy w historii tutaj, więc jest to prawdopodobnie znacznie dłużej niż mogłoby być (i prawdopodobnie dlatego, że jest w C #). Wszelkie wskazówki na temat tego, jak mogę to skrócić, byłyby świetne!
Dziękuję wszystkim w komentarzach, którzy mi pomogli!
Wersja golfowa
Wersja bez golfa
źródło
else
zapisywania kolejnych 5 znaków. I uruchamiając pętlę nai = 1
powinieneś być w stanie usunąć ostatni, jeśli kod można wykonać za każdym razem.s[i]
dostęp dla 5 znaków.P="PELpel"
iG="GHOSghos"
? Używasz ich tylko raz. Czy coś mi brakuje, czy to tylko 4 dodatkowe postacie? Potrzebujesz teżelse
?"PELpel".Contains(c)
i"GHOSghos".Contains(c)
powinny się wzajemnie wykluczać.Pyth,
534844 bajtów4 bajty dzięki @ Pietu1998 za sztuczkę
!!@
->}
(którą rozumieją tylko ludzie znający Pytha)Zestaw testowy.
źródło
!!@
jest to tylko trigrafia}
, prawda? : pMATL ,
373635 bajtówWypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6), 98 bajtów
Objaśnienie:
p
utrzymuje bieżącą liczbę granulek. Jeśli jest już ujemny, po prostu zwracamy znak i idziemy dalej, aby reszta łańcucha pozostała nietknięta. W przeciwnym razie badamy bieżący znak, a jeśli spowoduje to, żep
stanie się on ujemny, wstawiamy<
znak, w przeciwnym razie zastępujemy obecny znak na_
. Wreszcie, jeślip
nigdy nie staje się ujemny, dodamy a<
do łańcucha.źródło
Pyth,
474644 bajtówWypróbuj online. Zestaw testowy.
Zupełnie inne podejście niż Leaky Nun i jestem pewien, że można to pograć w golfa dalej.
źródło
Z
zamiastG
i zmieńf!
naf!h
t
w"ghost"
powinny być usunięteLua,
198190184185163 bajtówOk, przyznaję, to długo. Bardzo długo. Lua ma kilka narzędzi do zabawy ze strunami, ale jest ograniczona, to samo dotyczy warunkowych, które zajmują dużo miejsca.
Edycja: dzięki @LeakyNun za uratowanie mnie 9 bajtów :) Straciłem trochę bajtów, aby naprawić błąd
Edytuj rozwiązanie 2: 163 bajtów znalezione przez @LeakyNun
Stary 185
Bez golfa
źródło
d=c:lower()
i wyszukaj również wielkie literyand 1or s and 1or s
s and s
print(('').rep('_',i)..','..z:sub(i+1))
i
może byćnil
Python 3,
176157150149134133124 bajtówZdefiniuj nazwaną funkcję,
f
która przyjmuje ciąg jako argumentPrawdopodobnie można bardziej grać w golfa
Dziękujemy wszystkim, którzy skomentowali: D
źródło
x=c.upper()
i wyszukaj małe litery;
zamiast umieszczając je w osobnych wierszach. Możesz także użyć Python 2, który pozwala używać spacji jako pierwszego poziomu intencji, a tabulatorów jako drugiego.n=i=0
, nien=0
ii=0
.t[i]="_"
zamiastt[i] = "_"
, to samo dlat[i] = "<"
.return''.join(t)
usuń to miejsce."GgHhOoSs"
i"PpEeLl"
.Python 3,
114110 bajtówMój pierwszy golf golfowy.
Dziękujemy dr Green Eggs i Iron Manowi za zaoszczędzenie 4 bajtów.
Wykorzystuje ocenę wartości logicznych do jednego i zera w celu zagęszczenia logicznego AND do mnożenia. (0 * 0 = 0, 1 * 0 = 0, 1 * 1 = 1). Mam nadzieję, że to dobra pierwsza próba.
źródło
while s[x:]*l
zdjąć 4 bajty.PowerShell, 185
Nie golfowany:
źródło
Python3,
211184 bajtówArgument „s” jest ciągiem
Byłbym wdzięczny za wszelkie wskazówki dotyczące gry w golfa, ponieważ jest to moja pierwsza próba golfa
Dzięki za komentarz :)
źródło
return "_"*c + "<" + s[c:]
tylko,break
ponieważ ten kod i tak zostanie wykonany po pętli for.Haskell,
119113 bajtówPodziękowania dla Daniela Wagnera za 6 bajtów mniej.
Nazwij to jak
p "Hello World!"
.1then
To przypadek krawędzi, które są interpretowane prawidłowo w moim GHC (7.10), ale rzuca większości markerów składni. Więc może być różnie interpretowany również w twoim kompilatorze.Nie golfowany:
źródło
n!(c:s)|elem c"blah"=blah|elem c"blah"=blah|0<1=blah
.C, 237 bajtów
źródło
C ++,
315373327 bajtów(Uwaga: nadal gra w golfa)
źródło
if()
i usunięcie spacji wokół!=
,||
,=
,-
, i<=
. Ponadto niecin>>input
działa zamiastgetline
? Możesz także kondensować wokół;
.Rubin, (119 bajtów)
Prawdopodobnie brakuje mi pewnych rzeczy, ponieważ jestem nowy w tym ...
Ruby jest moją przyjaciółką :)
źródło
Perl, 54 (52 + 2) bajtów
Potrzeby
-p
, które zostaną określone w opcji wiersza polecenia.Wyjaśnienie:
Ta
-p
opcja powoduje zawinięcie instrukcji w pętli odczytu-modyfikacji-wydruku, gdzie podczas każdej iteracji pętli$_
zawiera wiersz danych wejściowych, w tym separator linii.Wyrażenie regularne jest w dużej mierze tym samym pomysłem, co w odpowiedzi Retina.
Nazwij wzorzec wyszukiwania
([pel](?1)*[ghos]|[^ghos ])*
„akceptowalny”. Następnie można go rekurencyjnie zdefiniować jako:Ciąg jest „akceptowalny”, jeśli:
PELLET
wyjątkiemT
, po którym następuje akceptowalny ciąg znaków, po którym następuje znak zGHOST
wyjątkiemT
.GHOST
pozaT
tym, że nie jest znakiem nowego wiersza.Ta definicja dopuszcza więcej granulek niż duchów:
PEL
postać może być dopasowana jako postać peletu lub postać niebędąca duchem.Pusty ciąg znaków jest uważany za akceptowalny, dlatego wyrażenie regularne gwarantuje dopasowanie do pozycji 0, gdzie zostanie dopasowany najdłuższy dopuszczalny podciąg.
Ten najdłuższy akceptowalny substrat jest następnie dopasowywany przez podkreślniki o równej długości, a następnie
<
.źródło
-p
zostało już użyte-
, np.perl -e
->perl -pe
, to-
jest bezpłatne. Ale myślę, żeperl -e
wersja jest dłuższa z powodu cytowania, więc myślę, że nie mogę jej tutaj użyć.