Zainspirowany przez We hopping tower i związany z 2D Maze Minus 1D
Wprowadzenie
Twoim zadaniem jest znalezienie najkrótszej ścieżki, aby wydostać się z labiryntu tablicowego zgodnie z określonymi regułami.
Wyzwanie
Macierz 1D a z n elementów można uznać za labirynt złożony z n punktów, przy czym punkt o indeksie k jest połączony z punktami za pomocą k + a [ k ] i k - a [ k ] w sposób jednokierunkowy. Innymi słowy, można przeskoczyć do przodu lub wstecz dokładnie [ k ] kroki od punktu o indeksie k . Punkty z indeksem poza granicami tablicy są traktowane poza labiryntem.
Aby to zilustrować, rozważ następującą tablicę:
[0,8,5,9,4,1,1,1,2,1,2]
Jeśli znajdujemy się teraz w piątym elemencie, ponieważ element ma 4, możemy przeskoczyć 4 kroki do przodu do 9 elementu lub 4 kroki do tyłu do pierwszego elementu. Jeśli zrobimy to drugie, otrzymamy element 0, co oznacza, że dalsze ruchy nie są możliwe. Jeśli zrobimy to pierwsze, ponieważ dziewiąty element to 2, możemy przeskoczyć do 11. elementu, który jest znowu 2, a następnie możemy ponownie wskoczyć do „13. elementu”, który jest poza granicami i rozważał wyjście do labiryntu.
Więc jeśli zaczniemy od elementu pośrodku, jednym ze sposobów na wydostanie się z labiryntu jest przeskoczenie 1 krok do tyłu, 4 kroki do przodu, 2 kroki do przodu i ponownie 2 kroki do przodu, które można wyrazić jako tablicę [-1,4,2,2]
. Alternatywnie można wyrazić z układem [4,8,10,12]
, który jest zapisywany indeksem zero na bazie wszystkich pośrednich i końcowych punktów (1 oparte wskaźnik jest dobry) lub tylko oznaczeń [-1,1,1,1]
.
Ucieczka z labiryntu od końca niskiego indeksu również jest OK.
Zastosowanie pierwszej notacji i rozpoczęcie od tego samego elementu [1,1,1,2,2]
jest również rozwiązaniem, ale nie jest optymalne, ponieważ jest 5 kroków zamiast 4.
Zadanie polega na znalezieniu najkrótszej ścieżki, aby wydostać się z labiryntu macierzy i wyprowadzić ścieżkę. Jeśli istnieje więcej niż jedna optymalna ścieżka, możesz wyprowadzić jedną lub wszystkie z nich. Jeśli nie ma rozwiązania, powinieneś wypisać wybraną przez siebie wartość fałszowania, która jest dostrzegalna z prawidłowej ścieżki (nie generowanie żadnego wyniku również jest OK).
Dla uproszczenia liczba elementów w tablicy jest zawsze liczbą nieparzystą i zawsze zaczynamy od elementu pośrodku.
Przypadki testowe
Przypadki testowe ilustrują różne formy wyników, ale nie są do nich ograniczone.
Input
Output
[0,8,5,9,4,1,1,1,2,1,2]
[-1,4,2,2]
[2,3,7,1,2,0,2,8,9]
[2,9] (or [2,-5] or [[2,9],[2,-5]])
[0,1,2,2,3,4,4,4,3,2,2,3,0]
[1,-1,1,1]
[0,1,2,2,4,4,6,6,6,6,6,4,2,1,2,2,0]
[]
Okular
Możesz napisać funkcję lub pełny program.
Tablica zawiera tylko nieujemne liczby całkowite.
Możesz pobierać dane wejściowe i wyjściowe za pomocą dowolnego standardowego formularza , ale w odpowiedzi określ, którego formularza używasz.
To jest golf golfowy , najniższa liczba bajtów wygrywa.
Jak zwykle obowiązują tutaj domyślne luki .
źródło
[0,8,5,9,4,1,1,1,2,1,2]
wyjścia[[-1,4,2,2]]
)[1,1,1,-1]
zamiast[-1,1,1,1]
?Odpowiedzi:
JavaScript (ES6), 117 bajtów
Zwraca tablicę pośrednich i końcowych punktów o indeksie 0 lub pustą tablicę, jeśli nie ma rozwiązania.
Wypróbuj online!
Skomentował
źródło
Łuska , 22 bajty
Zwraca listę znaków lub pustą listę, jeśli rozwiązanie nie istnieje. Wypróbuj online!
Wyjaśnienie
Jest to rozwiązanie typu brute force, które sprawdza listy
-1,0,1
o coraz większej długości i zwraca pierwsze, które powoduje wyskakiwanie z tablicy. Ponieważ ma minimalną długość, nie będzie zawierać zer.źródło
Python 3 ,
195188179 bajtówWypróbuj online!
Edytować:
all(..)and s => all(..)*s
,if u not in x => if{u}-x
Pierwsze wykorzystuje
boolean * list == int * list
, drugie wykorzystują różnicę zestawu (pusty zestaw jest również fałszem).Format wyjściowy: Zagnieżdżona tablica wszystkich optymalnych odpowiedzi, podana w postaci zerowych wskaźników punktów pośrednich i końcowych.
Na przykład:
f([0,8,5,9,4,1,1,1,2,1,2]) == [[4, 8, 10, 12]]
.Algorytm jest prosty BFS.
s
rejestruje wszystkie możliwei
ścieżki długości podczasi
iteracji, z wyłączeniem indeksów już odwiedzonych. Zauważ, że rozszerzona notacja gwiazdowa jest używana (ab), ponieważ wielokrotny dostęp do tablicy jest kosztowny. Stwierdziłem, że taki zapis może również zmniejszyć niektóre białe spacje, jeśli jest stosowany poprawnie.Z powyższego rozwiązania wykonałem również wersję rekurencyjną (ale dłuższą). Zarówno
s and
ior s
są potrzebne, w przeciwnym razie nie działa.Python 3 , 210 bajtów
Wypróbuj online!
źródło
Haskell ,
207202 bajtów5 bajtów zaoszczędzonych dzięki BMO .
Wypróbuj online!
Jest to funkcja, która przyjmuje listę
Int
jako parametr i zwraca listę ścieżek, gdzie każda ścieżka jest listą względnych skoków wykonanych w celu wydostania się z tablicy.Wersja bez golfa:
źródło
C (gcc) , 269 bajtów
Wypróbuj online!
Początkowo próbowałem rekurencyjnego wyszukiwania wstecznego, ponieważ korzystanie
main
z rekurencji jest zawsze zabawne. Ostatecznie jednak proste, nierekurencyjne wyszukiwanie po raz pierwszy zostało zmniejszone, czyli taka jest ta wersja. Ten program przyjmuje tablicę wejściową jako argumenty wiersza poleceń, bez nawiasów klamrowych, np.0 8 5 9 4 1 1 1 2 1 2
W pierwszym podanym przykładzie. Program wyświetla na wyjściu listę indeksów tablic 1-indeksowanych , rozdzielanych przecinkami, w odwrotnej kolejności, zaczynając od ostatecznego indeksu poza zakresem / „ucieczki” i przechodząc ponownie przez osiągnięte indeksy pośrednie (nie wyświetla środek, indeks początkowy). Program nie wyświetla nawiasów klamrowych wokół tablicy i pozostawia przecinek końcowy, ponieważ jest osobnyprintf
instrukcje mają wiele znaków. Dane wyjściowe odpowiadające pierwszemu przykładowi testu powyżej są13,11,9,5,
na przykład.Jeśli nie ma drogi ucieczki z labiryntu macierzowego, program nic nie wypisuje.
Odtłuszczono i wyjaśniłem, że jest poniżej (mocno odśluzowany z pewnymi zmianami dla czytelności):
Jak zwykle w golfowym kodzie C, wyniki kompilacji będą oczywiście zawierać przyjazną ścianę ostrzeżeń i notatek.
źródło
Perl 5 , -a: 73 bajty
(liczenie w starym stylu: 75 bajtów,
+1
dlaa
i+1
zastępowanie-//
przez-/$/
i używanie$`
dla$'
)Podaj tablicę wejściową jako jedną linię na STDIN, np
0 8 5 9 4 1 1 1 2 1 2
drukuje odwiedzane pozycje w odwrotnej kolejności, łącznie z punktem początkowym, a następnie ulega awarii
Nic nie drukuje, jeśli nie ma rozwiązania
Wypróbuj online!
źródło
Rubin , 102 bajty
Wypróbuj online!
Bierze labirynt wejściowy jako tablicę, wypisuje drukując ścieżkę ucieczki w odwrotnej kolejności, od wyjścia do punktu początkowego (włącznie). Nie drukuje nic, jeśli nie ma ucieczki.
Takie podejście niewłaściwie wykorzystuje metodę mapy do iteracji przez tymczasową tablicę przechowującą historię ścieżek, która jest stale rozszerzana w locie, ilekroć istnieje kolejny możliwy krok do zrobienia.
Zasadniczo mógłbym zaoszczędzić kolejny bajt, używając
return x
zamiast niegobreak p x
, ale oznaczałoby to twierdzenie, że moja wartość fałszowania jest równa wszystkim potwornym śmieciom w nim przechowywanymb
. Prawdopodobnie byłoby to zbyt wiele, nawet biorąc pod uwagę dopuszczalną elastyczność wyjścia ...Przewodnik
źródło