Wkład:
Labirynt zawierający postacie:
--
(ściana pozioma);|
(ściana pionowa);+
(połączenie);(przestrzeń spacerowa);
I
(wejście);U
(wyjście).
Czyli dane wejściowe mogą wyglądać następująco:
+--+--+--+--+--+--+--+--+--+--+
I | | |
+ +--+--+--+ + + + +--+ +
| | | | | |
+--+--+--+ +--+--+ + + +--+
| | | | |
+ +--+--+ + +--+--+ +--+ +
| | | | | |
+--+ + +--+--+ +--+--+ + +
| | | | | |
+ +--+--+--+ +--+--+ + + +
| | | | | |
+--+ + +--+--+ +--+--+--+--+
| | | | |
+ + +--+--+--+ +--+ + + +
| | | | | | | |
+--+--+ + +--+ + + +--+ +
| | | | | |
+ +--+--+--+ + + + + +--+
| | | | U
+--+--+--+--+--+--+--+--+--+--+
Wydajność:
Najskuteczniejszym ścieżka należy iść, aby uzyskać od wejścia do wyjścia z labiryntu (przez labirynt), wskazanym przez znaki wskazujące w lewo, w prawo, w górę iw dół (tj >
; <
; ^
; v
).
Zasady konkursu:
- Możesz pobrać dane wejściowe w dowolnym rozsądnym formacie. Ciąg-tablica, pojedynczy ciąg z nowymi wierszami, tablica znaków 2D itp. To wszystkie możliwe formaty wejściowe.
- Wynik może składać się z czterech dowolnych znaków. tj
><^v
;→←↑↓
;⇒⇐⇑⇓
;RLUD
;0123
;ABCD
; itp.). - W razie potrzeby możesz dodawać spacje lub końcowe znaki nowej linii; to jest opcjonalne.
- Kroki są liczone na kwadrat (patrz cztery
+
symbole kwadratów), a nie na postać. - Labirynt może mieć wymiary od 5x5 do 15x15 i zawsze będzie kwadratem (więc nie będzie żadnych przypadków testowych dla 5x10 labiryntów).
- Możesz założyć, że każdy labirynt ma jedną lub więcej prawidłowych ścieżek od początku do końca i zawsze generujesz najkrótsze (patrz przypadki testowe 4 i 5).
- Jeśli istnieje wiele ścieżek o tej samej długości, możesz wybrać, która z nich ma zostać wydrukowana (patrz przypadek testowy 6).
- Nie możesz „wyjść” poza granice labiryntu (patrz przypadki testowe 7 i 8).
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe:
1. Input:
+--+--+--+--+--+--+--+--+--+--+
I | | |
+ +--+--+--+ + + + +--+ +
| | | | | |
+--+--+--+ +--+--+ + + +--+
| | | | |
+ +--+--+ + +--+--+ +--+ +
| | | | | |
+--+ + +--+--+ +--+--+ + +
| | | | | |
+ +--+--+--+ +--+--+ + + +
| | | | | |
+--+ + +--+--+ +--+--+--+--+
| | | | |
+ + +--+--+--+ +--+ + + +
| | | | | | | |
+--+--+ + +--+ + + +--+ +
| | | | | |
+ +--+--+--+ + + + + +--+
| | | | U
+--+--+--+--+--+--+--+--+--+--+
1. Output:
>v>>>vv<v>>v>v>>vvv>>>
2. Input:
+--+--+--+--+--+
I | | |
+ +--+--+ + +
| | | |
+ +--+ + + +
| | | | |
+ + +--+ + +
| | |
+--+ + +--+--+
| | U
+--+--+--+--+--+
2. Output:
>vvv>>v>>>
3. Input:
+--+--+--+--+--+
U | |
+ + +--+--+ +
| | | |
+--+--+ + +--+
| | |
+ +--+--+--+ +
| | | |
+ + + + +--+
| | I
+--+--+--+--+--+
3. Output:
<<<^<v<^^>>^<^<<
4. Input (test case with two valid paths):
+--+--+--+--+--+
U | |
+ + +--+--+ +
| | |
+--+--+ + +--+
| | |
+ +--+--+--+ +
| | | |
+ + + + +--+
| | I
+--+--+--+--+--+
4. Output:
<<^>^<^<<^<< (<<<^<v<^^>>^<^<< is less efficient, and therefore not a valid output)
5. Input (test case with two valid paths):
I
+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+
| | | | |
+ + + +--+--+--+ + +--+--+ +--+--+ + +
| | | | | | | |
+--+--+--+ +--+ + +--+--+--+--+ +--+--+--+
| | | | | | | | |
+ + + + + +--+ + + + +--+--+ +--+ +
| | | | | | | |
+ +--+--+--+ +--+--+ + +--+ +--+--+ +--+
| | | | | | | | |
+ +--+ + +--+ +--+--+ +--+--+ + +--+ +
| | | | | | |
+ + +--+--+--+--+ + +--+--+--+ +--+ +--+
| | | | | | | |
+--+--+--+ + +--+--+ +--+ + +--+ +--+ +
| | | | | | | |
+ +--+--+--+--+ + + +--+--+--+ + + + +
| | | | | | | | | |
+--+ + + + + + +--+--+ + + +--+ + +
| | | | | | | | | |
+--+ +--+--+ + + + +--+--+--+ + + + +
| | | | | | | | | |
+ +--+ +--+--+ + +--+--+ + +--+ + + +
| | | | | | | | | |
+--+--+--+ + + +--+ + +--+--+ +--+ + +
| | | | | | | |
+ + +--+--+--+--+ +--+--+ +--+--+ +--+ +
| | | | | |
+ + + +--+--+--+--+--+--+--+--+ +--+ +--+
| | | |
+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
U
5. Output:
v<<<v<vv<<v<v>>^>>^^>vvv>>>v>vv<vv<<v<v<^<^^^^<vvvvv<^<v<<v>v>>>>>>>v (v<<<v<vv<<v<v>>^>>^^>vvv>>>v>vv<vv<<v<v<^<^^^^<vvvvv>v>>>^>>^>^^>vvv<v<v<<v is less efficient, and therefore not a valid output)
6. Input:
+--+--+--+--+--+
I |
+ + + + + +
| |
+ + + + + +
| |
+ + + + + +
| |
+ + + + + +
| U
+--+--+--+--+--+
6. Output:
>>v>v>v>v> or >v>v>v>v>> or >>>>>vvvv> or etc. (all are equally efficient, so all 10-length outputs are valid)
7. Input:
I U
+ + +--+--+--+
| | | |
+ +--+--+ + +
| | | |
+--+ + +--+ +
| | | |
+ +--+ + + +
| | |
+--+ +--+--+ +
| | |
+--+--+--+--+--+
7. Output:
vv>v>^>^<<^
8. Input:
+--+--+--+--+--+
| | |
+ +--+ +--+ +
I | | | |
+ + +--+ + +
U | | | |
+--+--+ + + +
| | | |
+ +--+--+--+ +
|
+--+--+--+--+--+
8. Output:
>v<
Labirynty generowane za pomocą tego narzędzia (w niektórych przypadkach nieznacznie zmodyfikowane).
code-golf
path-finding
maze
Kevin Cruijssen
źródło
źródło
v<<<<<<^^^^^
(zawsze myśl nieszablonowo)>v>>>vv<v>>v>v>>vvv>>>
.Odpowiedzi:
Retina ,
338281275273261 bajtówWypróbuj online!
Notatki
0x20
) są zastępowane interpunkcją (·
) zarówno w tej odpowiedzi, jak i w łączu TIO. Program działa poprawnie, jeśli spacje zostaną przywrócone.AvKr
w górę, w dół, w lewo i w prawo. Można je zastąpić dowolnymi literami opróczI
.Zajmuje około 40 sekund na TIO dla przypadku testowego 15 × 15. Bądź cierpliwy.Przerobiono część, aby znaleźć najkrótszą ścieżkę, gdy ścieżka dotrze do wyjścia. Okazało się, że zajęło to dużo czasu.Wyjaśnienie
Program składa się z 3 faz:
Format
Ponieważ oryginalny format labiryntu jest dość niewygodny, pierwsza część programu konwertuje go na inny format.
Komórki
W oryginalnym formacie każda komórka jest reprezentowana jako region 2 × 3:
Ponieważ prawa kolumna nie zawiera żadnych informacji, program identyfikuje komórki jako dowolny region 2 × 2 ze znakiem
+
w lewym górnym rogu.To pozostawia nam 3 rodzaje komórek:
U
w przypadku testowym 1 znajduje się w komórce R.W nowym formacie komórki są reprezentowane jako ciąg o zmiennej długości:
Lewa i górna ściana są kopiowane z oryginalnego formatu. Numer kolumny jest oparty na poziomej pozycji komórki i służy do wyrównywania (identyfikacja komórek bezpośrednio nad sobą / pod sobą). Ścieżka to ciąg alfabetyczny używany podczas fazy wypełniania, aby zapisać najkrótszą ścieżkę do osiągnięcia tej komórki. Znacznik ścieżki i wyjścia zostanie dokładniej wyjaśniony.
Półkomórki
Chociaż większość labiryntu to komórki, istnieją obszary labiryntu, które nie są komórkami:
+
s wzdłuż prawej ściany nie tworzą komórek, ponieważ znajdują się w ostatniej kolumnie.+
po lewej stronie. Na przykład wejścieI
w przypadku testowym 1 znajduje się w półkomórce L.Technicznie rzecz biorąc, nad labiryntem znajdują się pół-komórki T (gdy jest górne wypełnienie) i pół-komórki B (wzdłuż dolnej ściany, gdy nie ma dolnego wypełnienia), ale nie są reprezentowane w nowym formacie.
Górny rząd połowy komórki zostałby usunięty w ramach konstruowania pełnych komórek w tym samym rzędzie, więc pół komórki są reprezentowane w nowym formacie jako
Pół-komórki R są po prostu
|
. Pół-komórki L ma tylkoI
ścieżkę, tylko znacznik wyjścia i pustą ścieżkę lub pustą ścianę.Wejścia i wyjścia
Jeśli wejście znajduje się po lewej, prawej lub dolnej części labiryntu, znacznik wejścia
I
naturalnie znalazłby się w (pół) komórce jako ścieżka, którą można usunąć po zwróceniu ostatniej ścieżki.Jeśli wejście znajduje się powyżej labiryntu, pierwszy (w dół) krok jest wykonywany podczas fazy budowy, ponieważ półkomórki T są usuwane podczas budowy. To utrzymuje wykonalną ścieżkę w pełnej komórce. Górna ściana jest następnie zamykana.
Jeśli wyjście znajduje się po lewej, prawej lub dolnej części labiryntu, wówczas
U
naturalnie byłoby zawarte w (pół) komórce. Aby uniknąć pomyłki jako ścieżki,&
zamiast niego używany jest znacznik wyjścia inny niż alfanumU
. Znacznik wyjścia jest osadzony w komórce lub półkomórce (jak określono powyżej).Jeśli wyjście znajduje się powyżej labiryntu, byłby to jedyny otwór, który może przejść powyżej górnego rzędu komórek (ponieważ ten dla wejścia, jeśli jest obecny, byłby już zamknięty). Każda ścieżka prowadząca do tej dziury może wyjść z labiryntu, wykonując krok w górę.
Na koniec każda komórka B zawierająca wejście lub wyjście musi zamknąć lewą ścianę, aby zapobiec „rozwiązaniu” labiryntu przez spacery wzdłuż komórek B. Wejścia i wyjścia w komórkach R lub L półkomórkach nie wymagają dalszego przetwarzania, ponieważ algorytm wypełniania zalewowego nie pozwala na ruchy pionowe do / z nich.
Przykład
Na przykład pierwszy przypadek testowy
jest
w nowym formacie. Można konwertować inne labirynty tutaj .
Faza budowy
Faza budowy składa się z pierwszych 13 linii programu.
Konwertuje wyjście w L Półkomórka, aby wyjść z markera
Dodaje ściany po lewej stronie wejścia i wyjścia w komórkach B.
Robi pierwszy krok, jeśli wejście znajduje się nad labiryntem
Dokonuje faktycznej konwersji
Zamyka otwór górnego wejścia
Zachowuje tylko linie z
1
. Ponieważ labirynty mają szerokość co najmniej 5 komórek, a liczby kolumn występują z przyrostem 3, linia z komórkami nowego formatu musi zawierać numer kolumny między 10 a 19.Konwertuje wyjście w komórce R lub komórce B, aby wyjść z markera
Faza napełnienia
Faza wypełnienia tworzy kolejne 8 wierszy programu. Wykorzystuje algorytm wypełniania zalania, aby wypełnić wszystkie komórki najkrótszą ścieżką do osiągnięcia od wejścia.
Umieszcza całą fazę wypełnienia w pętli, aby wypełnić cały labirynt.
Robi to każda komórka zdolna do poruszania się w lewo. Komórka może się poruszać w lewo, jeśli
Następnie robi to każda komórka, która może się poruszać w prawo. Komórka może się poruszać w prawo, jeśli
Następnie robi to każda komórka, która może przejść w dół. Komórka może się przesunąć w dół, jeśli
Zauważ, że L Pół-komórki nie mogą się przesunąć w dół, ponieważ nie mają numerów kolumn.
Następnie robi to każda komórka, która może się przesunąć w górę. Komórka może się poruszać w górę, jeśli
Faza powrotu
Faza powrotu stanowi ostatnie 5 wierszy programu. Ta faza wyszukuje i zwraca ścieżkę wypełnioną do komórki wyjściowej.
Wzór ścieżki przy wyjściu zależy od tego, gdzie jest wyjście:
& <path>
<left wall> <column number> & <path>
<left wall> <column number> · <path>
w górnym rzędzie.Znajduje komórkę w górnym wierszu z pustą górną ścianą i niepustą ścieżką. Zajmuje się to ostatnim przypadkiem, dodając ostatni krok i znacznik wyjścia.
Dopasowuje i zwraca niepustą ścieżkę po znaczniku wyjścia.
Usuwa znacznik wyjścia i
I
prefiks ścieżki.źródło
AvKr
? Czy mają znaczenie / są skrótami w górę, w dół, w lewo i w prawo w twoim ojczystym języku, czy jest jeszcze jeden powód, dla którego wybrałeś te konkretne znaki?AvKr
są one najbliższe strzałkom w alfanum.Perl 6 ,
259295 bajtówJak to działa
To ściska labirynt, dzięki czemu wewnątrz każdej komórki jest 1x1 zamiast 2x1 znaków spacji:
Jest to funkcja rekurencyjnego wyszukiwania ścieżki. Przyjmuje trzy parametry: aktualną współrzędną
c=(y,x)
, listę już odwiedzonych współrzędnychv
oraz przebytąp
do tej pory ścieżkę (jako listę znaków strzałek).Jeśli postać na bieżącej współrzędnej jest spacją, powraca do czterech sąsiadów.
Jeśli znak na bieżącej współrzędnej to a
I
, to powraca do dwóch sąsiadów, którzy nie są „wzdłuż krawędzi”, aby wymusić rozwiązania, aby przejść przez labirynt, a nie wokół niego.Jeśli znak na bieżącej współrzędnej to a
U
, to wywołujetake
zgromadzony ciąg ścieżki.Funkcja rekurencyjna jest początkowo wywoływana ze współrzędną litery
I
, którą można znaleźć za pomocą wyrażenia regularnego.gather
Kluczowe zbiera wszystkie wartości, na którychtake
została zwane wewnątrz funkcji, czyli wszystkich prawidłowych ścieżek Niecyklicznych przez labirynt.Wybrano najkrótszą ścieżkę, co druga strzałka jest upuszczana, aby uwzględnić fakt, że potrzebne są dwa identyczne ruchy, aby przejść z jednej komórki do drugiej, a pozostałe strzałki są łączone w celu utworzenia łańcucha, który jest zwracany z lambda.
źródło
Python 2: 302 bajty
Pobiera dane wejściowe jako tablicę ciągów o tej samej długości. Drukuje
0
na prawo,1
na dół,2
na lewo i3
na górę.Wyjaśnienie
Przyjąłem inne podejście niż inne odpowiedzi. Pomysł ogólny: szukaj rekurencyjnie, znajdując najkrótszą ścieżkę między przejściem do przodu a obróceniem planszy o 90 stopni.
Wypróbuj online!
źródło
I
aby ścieżka nie wychodziła poza labirynt. Życzymy miłego pobytu i +1 ode mnie. :)JavaScript (ES6), 356 bajtów
Pobiera dane wejściowe jako tablicę znaków 2D. Każda linia musi być wypełniona lewą spacją o jedno miejsce i nie może mieć spacji końcowej, bez względu na to, gdzie znajdują się punkty początkowe / końcowe.
Wykorzystuje pomysł smlsa, aby wycisnąć labirynt, aby każda komórka była 1x1, i usunąć powtarzające się strzały z wyniku.
Nieoznakowany i wyjaśniony
Test Snippet
Pokaż fragment kodu
źródło
Siatkówka , 416 bajtów
Wypróbuj online! Gdybym widział to pytanie, kiedy zostało pierwotnie opublikowane, prawdopodobnie jest to odpowiedź, którą bym udzielił, więc i tak wysyłam je, mimo że w Retinie jest znacznie lepsza odpowiedź. Wyjaśnienie:
Wypełnij granicę. Pozwala to uniknąć chodzenia po labiryncie (np. W przypadku testowym 7).
Umieść nie alfabetyczny znacznik przy wejściu.
Wypełnienie powodziowe od wyjścia do wejścia. Na każdym kroku użyj litery, aby wskazać najlepszy kierunek (dawniej - może to być znane graczom; zastanawiałem się również nad hjkl, ale uznałem, że jest to zbyt mylące). Ponadto wolą powtarzać ten sam kierunek; pozwala to uniknąć przechodzenia w lewo / prawo między dwiema sąsiadującymi pionowo komórkami.
Załóżmy, że pierwszy krok jest w dół.
Ale jeśli powyżej, po lewej lub prawej stronie wejścia znajduje się litera, zmień ją na pierwszy krok.
Przesuń znacznik w kierunku ostatniego ruchu, odczytując kierunek następnego ruchu z kwadratu, do którego porusza się znacznik, i dodaj go do listy kierunków. To się powtarza, aż do
U
osiągnięcia.Usuń wszystko po wskazówkach, ponieważ nie jest już potrzebne.
Oryginalna siatka ma układ 3 × 2. Podczas ruchu w pionie, jeśli zygzakowimy w poziomie, wypełnienie zalewowe zoptymalizuje ruch i przesunie tylko 3n-1 znaki w poziomie, więc dzieląc przez trzy, musimy zaokrąglić w górę. Pionowo dzielimy przez 2.
Zbadałem również prawdziwe rozwiązanie siatki kwadratowej, tzn. Gdzie matryca znaków jest kwadratowa, a nie układem 3 × 2 z opcjonalną ramką. Prawdopodobnie niezgodna z pytaniem, możliwość transpozycji zmniejszyła liczbę bajtów do 350: Wypróbuj online!
źródło
-
wokół znaków wejściowych i wyjściowych. Ponieważ wyzwanie polega głównie na przejściu przez labirynt, myślę, że jest w porządku, ale jestem ciekawy: jakie były problemy, gdy nie umieściłeś tych ścian powyżej / poniżejI
iU
? Czy możesz również sprawdzić, czy to działa w przypadku testowym 7 zI
iU
na górze zamiast po bokach? TIO przekracza 60-sekundowy limit, więc nie jestem w stanie sam go przetestować. Chociaż czytam wyjaśnienie dotyczące pierwszej próby zejścia domyślnie, zakładam, że powinno działać dobrze.