Przesłanka
Ostatnio byłem około pół godziny wcześniej na spotkanie i postanowiłem zaczekać na zewnątrz. Stwierdziłem również, że wyglądałoby dziwnie, gdybym stał bez ruchu przed domem. Dlatego postanowiłem wybrać się na szybki spacer po ograniczonym obszarze. Doszedłem również do wniosku, że jeśli zacznę chodzić w kółko, będzie to oczywiste, że chodzę po okolicy. Zainspirowałem się więc do stworzenia pierwszego wyzwania Code Golf.
Specyfikacja
Otrzymasz listę, mapę obszaru, która będzie zawierać albo, " "
albo "#"
które reprezentują wolne przestrzenie i przeszkody. Wolne miejsca można przekroczyć tylko raz, a przejście zajmuje 1 minutę. Twoja początkowa pozycja będzie oznaczona "@"
tradycją roguelike, a cel będzie reprezentowany przez, "$"
ponieważ to właśnie tam stracisz. Otrzymasz również liczbę całkowitą, która będzie oznaczać, ile minut musisz marnować, zanim nie będziesz wyglądać, jakbyś się wtrącał. Kiedy wylądujesz na"$"
, będzie to musiała być dokładna ilość minut (więc jeśli odliczałeś, będzie to 1 na sąsiedniej płytce, i być 0 na kafelku). Zawsze będzie możliwe dotarcie do celu. Twój program lub funkcja będzie musiała zwrócić listę pokazującą najkrótszą ścieżkę za pomocą <,>, ^ i v, aby przedstawić cztery możliwe kierunki.
Przykłady
Wkład:
[[" ", " ", " ", " "],
["@", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
i
5
Ouput:
[[">", ">", ">", "v"],
["^", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
Wkład:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
i
7
Wydajność:
[[" ", "#", " ", " ", " "],
[" ", "#", ">", "v", " "],
["v", "#", "^", "$", " "],
[">", ">", "^", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
Wkład:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
i
17
Wydajność:
[[" ", "#", " ", "v", "<"],
[" ", "#", " ", "v", "^"],
["v", "#", " ", "$", "^"],
[">", ">", "v", ">", "^"],
[" ", "#", "v", "^", "<"],
[" ", "#", ">", ">", "^"]]
Zasady
- Obowiązują standardowe luki
- Każdy kafelek można przesunąć tylko raz
- Dokładna ilość czasu musi zostać spędzona na planszy
- W przypadku wielu ścieżek musi być wyświetlana tylko jedna ścieżka
- To jest pytanie do golfa, więc wygrywa najkrótsza odpowiedź
- Zgodnie z pytaniem user202729 w komentarzach, możesz założyć prawidłowe dane wejściowe.
Dodaj komentarz, jeśli wymagane są dalsze wyjaśnienia
źródło
Odpowiedzi:
JavaScript (ES6), 171 bajtów
Pobiera dane wejściowe w składni curry
(a)(n)
. Wyjścia poprzez modyfikację macierzy wejściowej.Wypróbuj online!
Skomentował
źródło
Python 2 ,
310256 bajtówDzięki @cairdcoinheringaahing za
except:0
-3 bajtyDzięki @Mnemonic za -8 bajtów
Dzięki @JonathanAllan za -3
bajki Dzięki @ovs za -5 bajtów
Wypróbuj online!
Niektóre wyjaśnienia:
try-except
służy do zapewnienia, że zarówno współrzędne , jakx
iy
współrzędne znajdują się w granicach. Wyjątek zostanie podniesiony po uzyskaniu dostępu doG[y][x]
. Python jest zbyt dobry, a ujemne wskaźniki są dopuszczalne, więcx>-1<y
dodaje się czek .T=[r[:]for r in G]
służy do tworzenia kopiiG
według wartości~-i/2
i~-(i^2)/2
służą do generowania par(-1, 0), (0, 1), (0, -1), (1, 0)
, które poruszały się w siatce (droga powinna być krótsza!)R+=[G]*(0==c<'$'==G[y][x])
sprawdź, czy'$'
osiągnięto wymaganą liczbę kroków.R
służy do uzyskania tego wyniku z rekurencyjnych wywołań funkcji.for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)
Znalezionyx
iy
stanowi'@'
w funkcji wejścia i połączeńS
.print R[0]
R
może zawierać więcej niż jedno rozwiązanie, więc najpierw wypisz dane wyjścioweźródło
if G[y][x]=='$':
goif'$'==G[y][x]:
.R+=(G[y][x]=='$')*(c==0)*[G]
innym bajtem.if(x>-1<y)*(G[y][x]in' @'):
y+cmp(i%2,i/2)
byłabyy+~-(i^2)/2
; może być jeszcze krótszy.Python 2 ,
264261251249 bajtówWypróbuj online!
źródło