tło
Budzisz się, aby zagubić się w jednowymiarowym labiryncie! Pojawia się mistyczny dżin (lub coś w tym rodzaju) i wyjaśnia, że wyjście znajduje się przed tobą, ale między tobą a wyjściem jest szereg wyzwań. Przechodząc do przodu, zdajesz sobie sprawę, że wszystkie tak zwane wyzwania są jedynie zamkniętymi drzwiami. Najpierw zobaczysz drzwi z otworem na klucz w kształcie trójnika, a sam nie mając takiego klucza, cofnij się, szukając klucza o T
kształcie.
Sfrustrowany, znajdziesz na ziemi alfabetyczną zupę kluczy, z których żaden nie pasuje do drzwi, które napotkałeś. Po pewnym geniuszu geniuszu (lub idiotyzmu) decydujesz, że t
klawisz w kształcie małych liter może być w stanie zmieścić się w gnieździe, jeśli wystarczająco mocno go zablokujesz. Gdy zbliżasz się do drzwi z t
kluczem w dłoni, T
otwór świeci na zielono, a drzwi rozpuszczają się przed tobą.
Jeden w dół, wiele więcej do zrobienia ...
Wyzwanie
Celem tego wyzwania jest określenie, ile kroków potrzeba, aby wyjść z labiryntu.
Wkładem tego wyzwania jest labirynt: jeden ciąg znaków zawierający tylko znaki [A-Za-z^$ ]
. Słownik:
^
- Początkowa przestrzeń. Dane wejściowe będą zawierać dokładnie jeden^
.$
- Wyjście (wolność!). Dane wejściowe będą zawierać dokładnie jeden$
.[A-Z]
- Wielkie litery oznaczają drzwi. Możesz przejść przez te drzwi tylko wtedy, gdy już zebrałeś wymagany klucz.[a-z]
- Małe litery oznaczają klawisze. Zbierasz te klucze, wchodząc na miejsce, w którym znajduje się klucz.
Na wejściu będzie co najwyżej jedna litera. Oznacza to, że całkowita liczba drzwi wyniesie od 0 do 26 włącznie.
Każde zamknięte drzwi [A-Z]
będą miały dokładnie jeden odpowiedni klawisz z małymi literami [a-z]
. Na wejściu może znajdować się dowolna liczba spacji ( ).
Wszystkie drzwi będą na prawo od startu i na lewo od wyjścia. W ten sposób nie będzie zbędnych drzwi. Wszystkie dane wejściowe będą rozwiązywalne.
Rezultatem tego wyzwania będzie liczba, liczba kroków, które trzeba było podjąć, aby wyjść z labiryntu.
Algorytm
Twoje metodyczne podejście do wyjścia z tego nędznego miejsca jest następujące:
- Zacznij od początku (
^
) i idź do przodu (w prawo), zbierając napotkane klucze. - Kiedy natrafisz na drzwi, jeśli masz odpowiedni klucz, idź do przodu. Jeśli nie masz właściwego klucza, idź do tyłu (w lewo), zbierając napotkane klucze, aż znajdziesz klucz do najnowszych drzwi, których nie możesz otworzyć.
- Po zebraniu klucza do aktualnych kłopotliwych drzwi odwróć się w prawo i idź dalej.
- Powtarzaj ten proces, aż przejdziesz do exit (
$
).
Doświadczeni golfiści zrozumieją, że Twój kod nie musi implementować tego konkretnego algorytmu, o ile generuje taki sam wynik, jak gdybyś uruchomił ten algorytm.
Rachunkowość
Za każdym razem, gdy przechodzisz z jednego kwadratu na drugi, liczy się to jako jeden krok. Obrót o 180º nie wymaga żadnego dodatkowego kroku. Nie można wejść do drzwi bez wymaganego klucza. Musisz wejść na klucz, aby go podnieść, i wyjść na wyjście, aby wygrać. Po pierwszym ruchu spacja początkowa ( ^
) zachowuje się tak jak każda inna spacja zwykła.
Przykłady
W tych przykładach zostawiłem spacje jako znaki podkreślające czytelność dla człowieka.
Dane wejściowe to _a_^_A__$__
. Dane wyjściowe to 11
. Robisz 1
krok naprzód, zauważ, że nie masz klucza do A
drzwi, a potem o twarzy. Idziesz do tyłu, aż zajmiesz miejsce zawierające a
( 3
kroki do tyłu, teraz 4
całkowite). Następnie idź naprzód, aż zajmiesz miejsce zawierające wyjście ( 7
kroki do przodu, 11
ogółem).
Dane wejściowe to b__j^__a_AJB_$
. Wynik jest taki, 41
że wykonujesz dwie oddzielne podróże na tył labiryntu, jedną po j
klucz i drugą b
.
Dane wejściowe to __m__t_^__x_T_MX_$____
. Dane wyjściowe to 44
. Nie zdobędziesz żadnej dodatkowej podróży, aby zdobyć x
klucz, ponieważ odebrałeś go w drodze od początku do drzwi T
.
Dane wejściowe to g_t_^G_T$
. Dane wyjściowe to 12
. Nie możesz przejść na G
pole bez klucza i natychmiast od razu. Masz szczęście, aby podnieść t
klucz w drodze do g
klucza, a tym samym otworzyć obie drzwi na drodze do wolności.
Wejście jest _^_____$
. Dane wyjściowe to 6
. To było łatwe.
Wytyczne I / O i zwycięskie kryterium
Obowiązują standardowe zasady we / wy. To wyzwanie dla golfa .
A
wbA^aB$
nie byłoby zbyteczne. ;)Odpowiedzi:
CJam, 45 lat
Wypróbuj online
Wyjaśnienie:
źródło
Pyth, 51 bajtów
zsumuj odległość między drzwiami a ich kluczem (podwojona, aby przejść w obie strony), ignorując „zagnieżdżone” klucze i odległość od początku do końca:
ten sam algorytm w python2.7:
źródło
Python 2,
155154134128 bajtówEdycja: Podziękowania dla @ user2357112 i @loovjo za komentarze, które pomogły mi zgolić kolejne
2026 bajtów mojego rozwiązania!źródło
i
jest to niepotrzebne?i
śledzi pozycję aktualnie przetwarzanych drzwi i jest wymagany, jeśli jego klucz nie został jeszcze odebrany (tj. jeślik
- pozycja klucza - jest mniejsza niżf
- najdalej po lewej stronie, którą przeszliśmy - wtedy musimy dodać2*(i-k-1)
kroki do naszej sumy (idąc w lewo, aby zdobyć klucz i idąc prosto do drzwi) ...?i
można go zastąpićl.index(d)
w piątym wierszu, a przypisanie usunąć w czwartym?e
if
zmienne wyglądają na zbędne. Możesz także zapisać kilka znaków, zapisującl.index
w zmiennej.x
jest również zbędny. Chyba moja golfowa noob-iness pokazuje. :) Dzięki za pomoc!C, 136 bajtów
źródło
PHP 5.3, 123 bajty
To jest mój pierwszy post na Code Golf, mam nadzieję, że jest wystarczająco dobrej jakości do gry w golfa na pierwszy post. Zdecydowanie fajne wyzwanie i niesamowite pytanie!
Ten program ładnie narusza fakt, że PHP nie wymaga wcześniejszej deklaracji żadnych zmiennych przed ich użyciem.
Okazało się również, że w moim ostatecznym rozwiązaniu było kilka bajtów krótszych, aby zacząć od 0 i zresetować licznik kroków po znalezieniu znaku początkowego, zamiast zaczynać od „^”.
Wszelkie wskazówki są zdecydowanie mile widziane!
źródło
JavaScript (ES6), 110 bajtów
Port odpowiedzi Pyth @ Rob.
źródło
Python 2.7,
234199179źródło
AWK, 174 bajtów
Prawdopodobnie istnieje ścisły algorytm, ale to właśnie wymyśliłem.
Pamiętaj, że używam
gawk
. Niektóre implementacjeAWK
mogą nie dzielić łańcucha w""
ten sposób.źródło
C #, 309 bajtów
Wersja bez golfa:
Nic szczególnego, po prostu iteruj przez łańcuch i zmieniaj kierunek w zależności od znaku i tego, czy klucz jest zawarty w łańcuchu kluczy.
m = ciąg labiryntu
k = ciąg kluczy
f = kierunek (prawda jest w labiryncie do przodu)
b = klucz do wyszukiwania podczas cofania
c = symbol zastępczy dla m [j], aby zapisać niektóre bajty z powodu częstego używania
j = indeks char ciągu znaków do obejrzenia
t = liczba
Wciąż stosunkowo nowy w golfie, więc jeśli gdzieś zobaczysz, mogę go schudnąć, daj mi znać!
źródło