Lodowe labirynty to jedna z moich ulubionych gier Pokémon od czasu ich debiutu w Pokémon Gold i Silver. Twoim zadaniem będzie stworzenie programu, który rozwiąże tego rodzaju problemy.
Lodowe labirynty składają się przede wszystkim, jak sama nazwa wskazuje, z lodu. Gdy gracz porusza się w kierunku na lodzie, będzie kontynuować ruch w tym kierunku, dopóki nie zderzy się z jakąś przeszkodą. Istnieje również gleba, którą można swobodnie przesuwać, co powstrzyma każdego gracza. Ostatnią przeszkodą jest kamień. Kamień nie może zajmować tego samego pola co gracz, a jeśli gracz spróbuje się do niego przenieść, przestanie się nim poruszać, zanim będzie mógł.
Otrzymasz dwuwymiarowy pojemnik wartości, taki jak lista list lub ciąg znaków oddzielone znakami nowej linii, zawierający 3 różne wartości dla każdego z 3 rodzajów podłóg (Lód, Gleba i Kamień). Otrzymasz również dwie pary (lub inne równoważne dwa kontenery wartości), które wskazują współrzędną początkową i bramkową w labiryncie. Mogą to być zero lub jeden indeks.
Musisz wypisać listę ruchów (4 odrębne wartości z wstrzyknięciem na N, E, S, W), które spowodują, że gracz dotrze do końca, gdy zostanie wykonany.
Wejście zawsze będzie miało zamknięty obwód kamienia wokół labiryntu, więc nie musisz się martwić, że gracz wyjdzie z labiryntu
To jest golf golfowy, więc wygrywa najmniej bajtów
Przypadki testowe
Tutaj .
będzie reprezentować lód, ~
będzie reprezentować glebę i O
będzie reprezentować kamień. Współrzędne są indeksowane 1. Każda litera w rozwiązaniu reprezentuje kierunek rozpoczynający się od tej litery (np. N
= Północ)
Wejście
OOOOO
OO.OO
O...O
OOOOO
Start : 3,3
End : 3,2
Wynik
N
Wejście
OOOOOOOOOOOOOOOOO
O........O.....OO
O...O..........OO
O.........O....OO
O.O............OO
OO.......O.....OO
O.............OOO
O......O.......~O
O..O...........~O
O.............OOO
O.......O......OO
O.....O...O....OO
O..............OO
OOOOOOOOOOOOOO~~O
OOOOOOOOOOOOOOOOO
Start : 15,12
End : 16,8
Wynik
N,W,N,E,N,E,S,W,N,W,S,E,S,E,N,E,N
Wejście
OOOOOOOOOOOOOOOO
O~~~~~OOOOO~~~~O
O~~O~OOOOOOO~~OO
O...O..........O
O........O.....O
O..............O
OO.............O
O.............OO
O....~....O....O
O..............O
O..............O
OOOOOOOOOOOOOOOO
Start : 2,2
End : 14,3
Wynik
E,S,S,W,N,E,N
Wejście
OOOOOOOOOOOOOOOOOOO
O~~~~~~~OOOOOOOOOOO
O~~~~...OOOOOOOOOOO
OO~O~..OOOOOOOOOOOO
O..OO.............O
O..............O..O
O....O............O
O.O............~..O
O........OOOO.....O
O.......OOOOO.....O
O.......O~~~O.....O
O.......~~~~~.....O
O.......~~~~~.....O
O..........O......O
O..O..~...........O
O...............O.O
O.....O...........O
O.................O
OOOOOOOOOOOOOOOOOOO
Start : 2,2
End : 11,11
Wynik
E,E,E,E,E,S,S,E,N,W,S,E,N,N,N
źródło
Odpowiedzi:
Mathematica, 247 bajtów
Z podziałami linii:
Mój bezpośredni pomysł polegał na przedstawieniu położenia lodu i gleby jako węzłów na wykresie z ukierunkowanymi krawędziami odpowiadającymi legalnym ruchom, a następnie użycia
FindPath
. Można by pomyśleć, że ustalenie legalnych ruchów byłoby łatwą częścią, a znalezienie rozwiązania byłoby trudną częścią. Dla mnie było odwrotnie. Otwórz się na sugestie dotyczące obliczania krawędzi.Pierwszy argument
#
to tablica 2D, w której0
reprezentuje lód,1
reprezentuje glebę i2
kamień.Drugi argument
#2
i trzeci argument#3
są odpowiednio punktami początkowymi i końcowymi w formie{row,column}
.
jest 3-bajtowym znakiem prywatnego użytkuU+F4A1
reprezentującym\[Function]
.Wyjaśnienie
Definiuje funkcję,
p
która przyjmuje listęx
formy{row,column}
i wyników#[[row,column]]
; tj. wartość lodu / gleby / kamienia przy tej współrzędnej.Definiuje funkcję,
m
która przyjmuje pozycję początkowąc
i wektor kierunkuv
i rekurencyjnie określa, gdzie miałbyś się skończyć. Jeślic+v
jest lodem, kontynuujemy ślizganie się od tego miejsca, więc powracam[c+v,v]
. Jeślic+v
jest to gleba, ruszamy sięc+v
i zatrzymujemy. W przeciwnym razie (jeślic+v
jest kamień lub poza granicami), nie ruszasz się. Należy pamiętać, że jest to przeznaczone tylko do wywoływania na lodzie lub w glebie.Definiuje listę
g
pozycji lodu i gleby (p
wartość mniejsza niż2
).Definiuje funkcję
a
, która pobiera pozycję wyjściowąc
i zwraca wyniki poruszania się w{1,0}
,{-1,0}
,{0,1}
oraz{0,-1}
kierunkach. Może wystąpić pewna nadmiarowość. Ponownie zakłada się, żec
odpowiada to lodzie lub glebie.Definiuje listę
e
skierowanych krawędzi reprezentujących legalne ruchy. Dla każdej pozycji#
wg
, obliczyć tabelę krawędziach#->c
dla każdegoc
ina@#
. Ponieważ skończy się z podlistą dla każdej pozycji#
, spłaszczam pierwszy poziom. Mogą występować pewne pętle i wiele krawędzi.Graph[e]
to wykres, na którym węzły to pozycje prawne (lód lub gleba), a krawędzie reprezentują legalne ruchy (możliwe, że zderzają się z kamieniem i nie poruszają się). Następnie używamyFindPath
do znalezienia ścieżki od#2
do#3
reprezentowanej jako lista węzłów. PonieważFindPath
można wziąć dodatkowe argumenty, aby znaleźć więcej niż jedną ścieżkę, wynikiem będzie faktycznie lista zawierająca jedną ścieżkę, więc biorę pierwszy element za pomocą[[1]]
. Następnie biorę kolejnoDifferences
współrzędne iNormalize
je. Tak więc góra jest{-1,0}
, dół jest{1,0}
, prawo jest,{0,1}
a lewa jest{0,-1}
.Przypadki testowe
źródło
JavaScript (ES6) 180
183Używając BFS , tak jak zrobiłem, aby rozwiązać to powiązane wyzwanie
Wejście
Mapa labiryntu jest ciągiem wielowierszowym, używającym
O
lub0
do kamienia,8
do gleby i każdej niezerowej cyfry mniejszej niż 8 dla lodu (7
dobrze wygląda).Pozycja początkowa i końcowa są zerowane.
Dane wyjściowe
Lista przesunięć, gdzie -1 to
W
, 1 toE
, ujemna mniej niż -1 toN
i dodatnia większa niż 1 toS
Mniej golfa
Test
źródło