Jesteś na zaawansowanej międzygalaktycznej stacji kosmicznej. Twój przyjaciel, który pracuje w Studium Grawitacji, właśnie stworzył grę, która polega na użyciu mikrograwitacji jako sposobu na poruszanie piłką.
Podaje ci małego kontrolera z czterema strzałkami kierunkowymi i labiryntową strukturą z piłką siedzącą po lewej stronie. Zaczyna wyjaśniać, jak działa gra.
- Masz 2 przyciski kierunkowe, lewy
<
i prawy>
. - Masz również 2 przyciski grawitacji, w górę
^
i w dółv
(przynajmniej z poziomu odniesienia) - Za pomocą tych przycisków strzałek możesz poruszać piłką po ekranie.
„Teraz należy przestrzegać kilku zasad”. ona mówi
- Przed dojściem do pucharu wszystkie platformy muszą przejść
\ /
- Strzałki
< > ^ v
zostaną wykorzystane do określenia ruchu piłki - Grawitacja to
^ v
(góra i dół). To przesuwa piłkę do następnej platformy w tym kierunku. (Odległość nie jest obliczana dla wzlotów i upadków) - Zgubienie piłki jest złe! Nie spadaj poza krawędź i nie zmieniaj grawitacji zbyt wcześnie, aby Twoja piłka nigdy nie osiągnęła platformy
- Ruch jest liczony w krokach co
< >
- Piłka może wejść do kubka z dowolnego kierunku, o ile przestrzegana jest reguła 1
- Musisz określić kierunek grawitacji, aby twoja piłka nie odpłynęła
- Ruch może być losowy, o ile przestrzegana jest reguła 1 i reguła 4
- W przypadkach, których nie można rozwiązać, należy wpisać False lub Invalid
Prosty przykład piłki, platformy i kubka:
v
o
---\ /
v>
o
---\ /
v>>
o
---\ /
v>>>
o
---\ /
v>>>>
---\o/
Przykład ponownego przejścia przez tę samą platformę.
v
o
----
\ /-------
v>
o
----
\ /-------
v>>
o
----
\ /-------
v>>>
o
----
\ /-------
v>>>>
----
o
\ /-------
v>>>>>
----
o
\ /-------
v>>>>>>
----
o
\ /-------
v>>>>>>>
----
o
\ /-------
v>>>>>>>>
----
o
\ /-------
v>>>>>>>><<<<<<<< # move all the way to the left to get to the cup
----
\o/-------
Przykład przełączania grawitacji
v
--/ \
o
----
v>
--/ \
o
----
v>>
--/ \
o
----
v>>>
--/ \
o
----
v>>>^
--/ \
o
----
v>>>^>
--/ \
o
----
v>>>^>>
--/ \
o
----
v>>>^>>>
--/o\
----
Zadanie
Twoim zadaniem jest stworzenie programu, który pobierze reprezentację kursu ASCII jako dane wejściowe. I wyślij ciąg strzałek <>^v
przedstawiających kierunek i siłę grawitacji, aby przenieść piłkę w o
poprzek platforms
do kubka.
Obowiązują standardowe zasady gry w golfa
Przypadki testowe
Wejście (sytuacja, w której przełączana jest grawitacja)
---- --/ \
--- --
o
------ -----
Wydajność
^>>v>>>>>^>>>>>v>>>>^>>>
Wejście (sytuacja, w której zmienia się kierunek)
---
o
----
---
-----
--\ /
Wydajność
v>>>>>>^>>>v<<<<<v>>>
Wejście (sytuacja, w której musisz dwukrotnie przejść przez tę samą platformę)
o
------
------
------
\ /------
Wydajność
v>>>>>><<<<<<>>>>>>><<<<<<
Złe przypadki, program powinien wypisać dla nich Falsy
Piłka nie może dostać się na następną platformę
o
--- ---
Piłka odpłynie w kosmos
---
o
---
Sytuacja, w której piłka dostaje się do kubka, ale wszystkie platformy się nie przechodzą.
o
----
----
\ /----
źródło
Odpowiedzi:
Pyth, 431 bajtów
To jest mój pierwszy program w języku Pyth (tak naprawdę to mój pierwszy program w dowolnym języku golfowym), co oznacza, że prawdopodobnie można go jeszcze ulepszyć.
Wypróbuj tutaj (ostatnia walizka testowa wymaga zbyt dużo czasu, należy ją przetestować przy użyciu lokalnej instalacji Pyth).
Zrzut szesnastkowy kodu (użyj
xxd -r <filename>
do dekodowania):Wyjaśnienie
Główną ideą tego programu było użycie wyrażeń regularnych do modyfikacji danych wejściowych. Aby zaoszczędzić miejsce, wszystkie te wyrażenia regularne są zawarte w skompresowanym ciągu. Pierwszym krokiem w programie jest dekompresja ciągu i podzielenie go na pojedyncze wyrażenie regularne i odpowiadające im ciągi zastępujące.
Zawartość zmiennej
J
to:Funkcja
r
stosuje podstawienia wyrażeń regularnych z listy przechowywanej wJ
indeksieG
do wszystkich ciągów na liścieH
. Zwraca się, gdy tylko jeden z ciągów zostanie zmieniony.Funkcja
i
jest podobna do funkcjir
z 2 różnicami. Stosuje podstawienia na liście transponowanej (pionowej zamiast poziomej). Powoduje także wielokrotne podstawienia, o ile cokolwiek się zmieni.Funkcja
g
sprawdza, czy wyrażenie regularne z listy przechowywanej wJ
indeksieG
można znaleźć w dowolnym ciągu na liścieH
.Reszta kodu zawiera logikę programu. Przeprowadza pierwsze wyszukiwanie możliwych ruchów, aż do znalezienia rozwiązania. Pozycja w drzewie wyszukiwania jest jednoznacznie określona przez kierunek grawitacji i zmodyfikowaną kopię danych wejściowych programu. Aby uniknąć ponownego przetwarzania tej samej pozycji, przetworzone pozycje są zapisywane na liście globalnej
K
. Pozycje, które należy jeszcze przetworzyć, są przechowywane razem z odpowiednią częścią rozwiązania na liścieY
.Modyfikacja danych wejściowych oraz inicjalizacja
K
iY
są wykonywane przez następujący kod:Modyfikacja danych wejściowych działa w następujący sposób. Dane wejściowe:
przekształca się w:
Wartości mają następujące znaczenie:
-
Platforma, którą należy jeszcze odwiedzić=
Platforma, której nie trzeba już odwiedzaćM
Puchar, do którego można wprowadzić grawitację ustawioną na „dół”W
Puchar, do którego można wprowadzić grawitację ustawioną na „górę”V
Można bezpiecznie przenieść się do tego miejsca z grawitacją ustawioną na „dół”A
Można bezpiecznie przenieść się w to miejsce z ustawioną grawitacjąX
Można bezpiecznie przenieść się w to miejsce niezależnie od ustawienia grawitacji6
Piłka na miejscu oznaczonym jakoV
9
Piłka na miejscu oznaczonym jakoA
0
Piłka na miejscu oznaczonym jakoX
Logika używa wyrażeń regularnych do wykonywania ruchów. W powyższym przykładzie, jeśli grawitacja byłaby ustawiona na „w górę”, możemy zastąpić „9A” „A9” wyrażeniem regularnym, aby przesunąć piłkę w prawo. Oznacza to, że próbując zastosować wyrażenie regularne, możemy znaleźć wszystkie możliwe ruchy.
Funkcja
X
Wykonuje ruchy pionowe kulkowe oparte na aktualnym ustawieniem grawitacyjnego, zapisuje wynik na światowych listachK
iY
, i sprawdza, czy rozwiązanie zostało znalezione.Funkcja
(
realizuje kontrole dla 4 przycisków kierunkowych / grawitacyjnych. Przyciski grawitacji można nacisnąć tylko wtedy, gdy zmienia się bieżąca grawitacja i jeśli piłka znajduje się w bezpiecznym miejscu, aby zmienić grawitację. Przyciski kierunkowe można nacisnąć tylko wtedy, gdy można bezpiecznie przenieść się w odpowiednie miejsce.Wreszcie główna pętla. Pierwszy element
Y
jest usuwany wielokrotnie i wykonywane są sprawdzenia wszystkich możliwych ruchów.źródło
Y
lista będzie pusta, pop wyrzuci błąd i#
pętla się zakończy.