Wyzwanie
Biorąc pod uwagę rozmiar siatki, pozycje przeszkód, pozycję gracza i pozycję docelową, Twoim zadaniem jest znaleźć ścieżkę, aby gracz mógł dotrzeć do celu i jednocześnie unikać przeszkód (jeśli to konieczne).
Wejście
- N : Rozmiar siatki
N x N
- P : Pozycja gracza
[playerposx, playerposy]
- T : Pozycja celu
[targetposx, targetposy]
- O : Pozycje przeszkód
[[x1, y1], [x2, y2],...,[xn, yn]]
Wynik
Ścieżka : Gracz ścieżki może dotrzeć do celu[[x1, y1], [x2, y2],...,[xn, yn]]
Zasady
- Punkt
[0,0]
znajduje się w lewym górnym rogu siatki. - Pozycja gracza zawsze będzie po lewej stronie siatki.
- Pozycja celu zawsze będzie po prawej stronie siatki.
- Siatka zawsze będzie miała co najmniej jedną przeszkodę.
- Możesz założyć, że żadna przeszkoda nie pokrywa się z pozycją gracza lub celu.
- Nie musisz koniecznie znaleźć minimalnej ścieżki.
- Gracz może poruszać się tylko w lewo, w prawo, w górę i w dół, a nie po przekątnej.
- Możesz pobrać dane wejściowe w dowolny wygodny sposób.
- Możesz założyć, że ścieżka do gracza zawsze będzie istniała.
- Oczywiście dla każdego wejścia istnieje wiele prawidłowych ścieżek, wybierz jedną.
- Załóżmy
N > 2
, że siatka będzie co najmniej3 x 3
.
Przykłady
Wejście: 9
, [6, 0]
, [3, 8]
, [[0, 5], [2, 2], [6, 4], [8, 2], [8, 7]]
Możliwość wyjścia:[[6, 0], [6, 1], [6, 2], [6, 3], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [4, 8], [3, 8]]
Wejście: 6
, [1, 0]
, [3, 5]
, [[1, 2], [2, 5], [5, 1]]
Możliwość wyjścia:[[1, 0], [1, 1], [2, 1], [2, 2], [2, 3], [2, 4], [3, 4], [3, 5]]
Uwaga
Zauważ, że dotyczy X
to wierszy i Y
kols. Nie myl ich ze współrzędnymi na obrazie.
Edytować
Jak wskazano @digEmAll, ze względu na zasady #2
oraz #3
, playerY = 0
i targetY = N-1
. Tak więc, jeśli chcesz, możesz wziąć tylko jako dane wejściowe playerX
i targetX
(jeśli to skraca kod).
źródło
Odpowiedzi:
JavaScript (ES6), 135 bajtów
Pobiera dane wejściowe jako
(width, [target_x, target_y], obstacles)(source_x, source_y)
, gdzie przeszkodą jest tablica ciągów w"X,Y"
formacie.Zwraca tablicę ciągów w
"X,Y"
formacie.Wypróbuj online!
Skomentował
źródło
R 227 bajtów
Wypróbuj online!
Niezbyt krótkie i zdecydowanie nie podające najkrótszej ścieżki (np. Sprawdź pierwszy przykład).
Zasadniczo wykonuje rekurencyjne wyszukiwanie od głębokości i zatrzymuje się, gdy tylko cel zostanie osiągnięty, drukując ścieżkę.
Podziękowania dla JayCe za ulepszenie formatowania wyjściowego
źródło
x1 y1 x2 y2 ... xn yn
: Dwrite(t(mx),1,N)
zamiastprint
ing :)Python 2 ,
151149 bajtówWypróbuj online!
źródło
Haskell ,
133131130 bajtówWypróbuj online! (z kilkoma testami)
Funkcja
!
przyjmująca jako dane wejściowen :: Int
rozmiar siatkip :: [Int]
pozycja gracza jako lista[xp, yp]
o :: [[Int]]
pozycja przeszkód jako lista[[x1, y1], [x2, y2], ...]
t :: [[[Int]]]
(domyślnie) pozycja celu jako lista[[[xt, yt]]]
(lista potrójna dla wygody)i zwracając prawidłową ścieżkę jako listę
[[xp, yp], [x1, y1], ..., [xt, yt]]
.Jako bonus znajduje jedną z najkrótszych ścieżek i działa na dowolnej pozycji gracza i celu. Z drugiej strony jest bardzo nieefektywny (ale podane przykłady działają w rozsądnym czasie).
Wyjaśnienie
iterate
[[xt, yt]]
Pozornie niejasne wyrażenie
[id, map (+ 1)] <*> [[x - 1,y], [x, y - 1]]
jest po prostu „golfową” (-1 bajtową) wersją[[x + 1, y], [x, y + 1], [x - 1, y], [x, y - 1]]
.źródło
Retina 0.8.2 , 229 bajtów
Wypróbuj online! Nie jestem pewien, czy kwalifikuje się format we / wy. Wyjaśnienie:
Duplikuj każdą komórkę. Lewa kopia służy jako tymczasowy obszar roboczy.
Oznacz początek labiryntu jako odwiedzony.
Oznacz koniec labiryntu jako pusty.
Chociaż istnieją dostępne działające komórki, skieruj je do sąsiednich wcześniej odwiedzonych komórek.
Śledź ścieżkę od wyjścia do początku, używając komórek roboczych jako wskazówek.
Usuń działające komórki.
źródło
JavaScript, 450 bajtów
Pobiera dane wejściowe jako
(n, {playerx, playery}, {targetx, targety}, [{obstaclex, obstacley}])
. Zwraca tablicę{hopx, hopy}
.Oto nieobjawiona wersja mojego bałaganu:
źródło