Biorąc pod uwagę 2 liczby całkowite reprezentujące rozmiar pola x
i y
wyprowadzamy ścieżkę przez pole.
Przykładowe dane wyjściowe dla 5, 4
:
#
#
# ###
### #
Całe pole ma wymiary 5 na 4, a ścieżka składa się z krzyżyków przecinających pole.
Ścieżka powinna zawsze zaczynać się w lewym górnym rogu i przechodzić do prawego dolnego rogu. Cała ścieżka powinna być losowa przy każdym uruchomieniu programu. Każda poprawna ścieżka powinna być możliwym wyjściem.
Reguły dla ścieżek są następujące:
Wykonane z hashmarków
Każdy skrót jest połączony tylko z 2 innymi skrótami (tzn. Ścieżka nie przecina się ani nie biegnie obok siebie)
Nie-hash spacje mogą być wypełnione dowolnym innym znakiem, ale muszą być spójne (tj. Wszystkie spacje, wszystkie kropki itp.)
Przykłady:
2, 2
##
#
3, 4
##
##
#
#
5, 5
#####
#
#
#
#
6, 5
## ###
# # #
## # #
# ## #
### #
7, 9
#######
#
#### #
# # #
# # #
# # #
# ####
#
#######
Ten rodzaj ścieżki jest podobny do unikającego się losowego marszu, jednak nie może przylegać do siebie w przeciwieństwie do prawdziwej SAW.
Ciągłość ścieżki i dotykanie ścieżki są zdefiniowane bez przekątnych.
Odpowiedzi:
MATLAB,
316 305 300293 bajtówDzięki @LuisMendo za różne sugestie i kilka bajtów =)
Wypróbuj online! (Bez gwarancji: Należy pamiętać, że trzeba było wprowadzić kilka poprawek, aby działało ono w systemie Octave: po pierwsze musiałem usunąć
function
słowo kluczowe i zakodować wartości, po drugie: spacje nie są drukowane poprawnie, jak w Matlabie. Również nie sprawdź polecenia splotu Octave, które mogą działać inaczej.)Przykładowe dane wyjściowe dla danych wejściowych
(7,10)
(może to już potrwać dość długo):Wyjaśnienie
To generuje ścieżki sekwencyjnie od górnego lewego do dolnego prawego z pożądaną 4-łącznością, a następnie wykorzystuje próbkowanie odrzucania, aby odrzucić ścieżki, które naruszają kryterium, że nie można mieć sąsiednich części.
No i jak zawsze:
źródło
Befunge, 344 bajty
Wypróbuj online!
Jak wspomniano @flawr w odpowiedzi MATLAB, może to trochę potrwać, jeśli rozmiar pola ma dowolny nietrywialny rozmiar. W rzeczywistości dość łatwo jest wpaść w sytuację, w której naprawdę nie warto czekać na jej zakończenie, ponieważ prawdopodobnie czekasz do końca czasu.
Aby zrozumieć, dlaczego tak się dzieje, pomocne jest wyświetlenie programu uruchamianego w jednym z wielu „wizualnych debuggerów” Befunge. Ponieważ dane i kod są takie same w Befunge, będziesz mógł zobaczyć ścieżkę, która zmienia się w czasie. Na przykład, tutaj jest krótka animacja pokazująca, jak może wyglądać część biegu na wolnej ścieżce.
Gdy algorytm zdecyduje się wykonać ten fatalny zwrot w lewo u dołu granicy pola, zasadniczo skazał się na całe życie bezcelowej wędrówki. Od tego momentu musi podążać każdą możliwą ścieżką na tym odgrodzonym terenie, zanim będzie mógł się wycofać i spróbować skręcić w prawo. A liczba potencjalnych ścieżek w tych przypadkach może łatwo stać się astronomiczna.
Konkluzja: Jeśli wydaje się, że zajmuje to dużo czasu, prawdopodobnie dobrym pomysłem jest po prostu przerwać wykonywanie i zacząć od nowa.
Wyjaśnienie
Jest to w zasadzie algorytm rekurencyjny, wypróbowujący każdą możliwą ścieżkę przez pole, a następnie odwijający kroki, które zostały już wykonane, gdy tylko utknie. Ponieważ Befunge nie ma pojęcia funkcji, funkcja rekurencyjna nie wchodzi w rachubę, ale możemy naśladować ten proces, śledząc stan na stosie.
Działa to poprzez wypełnienie stosu potencjalnymi współrzędnymi, które możemy chcieć śledzić. Następnie wyciągamy jeden zestaw ze stosu i sprawdzamy, czy jest on odpowiedni (tj. W zasięgu i nie pokrywa się z istniejącą ścieżką). Kiedy już znajdziemy dobre miejsce, zapisujemy
#
na polu gry w tej lokalizacji i dodajemy te szczegóły do stosu, na wypadek, gdybyśmy musieli później wrócić.Następnie wypychamy dodatkowe cztery zestawy współrzędnych na stos (w losowej kolejności), wskazując potencjalne ścieżki, które możemy wziąć z tej nowej lokalizacji, i przeskakujemy z powrotem na początek pętli. Jeśli żadna z potencjalnych ścieżek nie jest wykonalna, przejdziemy do punktu na stosie, w którym zapisaliśmy lokalizację,
#
którą wypisaliśmy, więc cofniemy ten krok i będziemy kontynuować próbę potencjalnych współrzędnych z poprzedniego kroku.Oto jak wygląda kod z wyróżnionymi różnymi częściami komponentu:
Odczytaj szerokość i wysokość pola i popchnij współrzędne początkowe wraz ze
0
znacznikiem typu, aby wskazać potencjalną ścieżkę, a nie lokalizację cofania.Sprawdź lokalizacje cofania (wskazane przez
1
znacznik typu), które są cofane za pomocą prostejp
komendy, ponieważ są przechowywane w dokładnie takim formacie, jaki jest potrzebny do zapisania miejsca z powrotem na polu gry.Sprawdź, czy współrzędne nadal znajdują się na polu gry. Jeśli są poza zasięgiem, upuść je ze stosu i zapętl z powrotem, aby wypróbować następne potencjalne współrzędne.
Jeśli są w zasięgu, pobierz dwie kolejne wartości ze stosu, czyli lokalizacji z poprzedniego kroku (wymagane w teście, który następuje po tym).
Sprawdź, czy współrzędne mają zetknąć się z istniejącym segmentem ścieżki. Lokalizacja poprzedniego kroku jest oczywiście ignorowana podczas tej kontroli.
Jeśli wszystkie testy zakończą się pomyślnie, napisz
#
na pole gry i sprawdź, czy dotarliśmy do miejsca docelowego.Jeśli tak, napisz ostatnią ścieżkę i wyjdź.
W przeciwnym razie zapisz współrzędne na stosie ze
1
znacznikiem typu do późniejszego cofnięcia.Jest to przerywane obliczaniem liczb losowych, które wkrótce będziemy potrzebować.
Wciśnij cztery potencjalne miejsca docelowe, do których można dotrzeć z bieżącej lokalizacji. Liczba losowa określa kolejność ich wypychania, a tym samym kolejność, w jakiej będą przestrzegane.
Zawiń z powrotem na początek głównej pętli i przetwarzaj kolejne wartości na stosie.
źródło
QBasic, 259 bajtów
Na pewno kocham
GOTO
s.Podstawowa strategia: na każdym kroku drukuj a
#
do bieżącej lokalizacji i poruszaj się w losowym kierunku. Tablicaa
zer i jedynek śledzi, gdzie byliśmy. Jeśli ruch jest legalny i zabiera nas do punktu końcowego,GOTO 9
należy wyjść z pętli i wydrukować końcowy#
. W przeciwnym razie, jeśli ruch jest legalny, zrób kolejny krok. W przeciwnym razie wyczyść ekran i zacznij od nowa (znacznie bardziej golfista niż kodowanie algorytmu cofania!).Testowany na moim laptopie w QB64, generalnie daje wynik
9, 9
w ciągu pięciu sekund lub krócej. Trasy10, 10
trwały od trzech do 45 sekund. Teoretycznie wszystkie legalne ścieżki mają niezerowe prawdopodobieństwo, ale prawdopodobieństwo ścieżki o dużych krzywych jest znikomo małe. Od czasu do czasu widziałem ścieżki z jedną lub dwiema małymi krzywymi:Wersja bez golfa i / lub szczegółowe wyjaśnienia dostępne na żądanie.
źródło
R, 225 bajtów
Wyjaśnienie:
Generujemy zwykły (kratowy) [x * y] niekierowany wykres z losowymi ciężarami na krawędziach, a następnie znajdujemy najkrótszą ścieżkę od początku do końca. Jednak w wygenerowanej ścieżce mogą znajdować się komórki, które mają na przykład więcej niż dwóch sąsiadów:
Powinniśmy więc zastosować algorytm najkrótszej ścieżki dwa razy. Za drugim razem ustawiamy wszystkie wagi na 1, z wyjątkiem tych, które znajdują się w bieżącej znalezionej ścieżce, która jest ustawiona na 0;
wynik
Nie golfowany:
źródło
JavaScript (ES7),
333331330329324318312 bajtówObjaśnienie:
#
s są losowo umieszczane w tablicy, dopóki ścieżka nie zostanie znaleziona w polu za pomocą wyszukiwania szerokości pierwszego; pierwsza, a zatem najkrótsza, taka ścieżka jest następnie wyprowadzana; gwarantuje to, że ścieżka się nie przecina. Zauważ, że szczególnie w przypadku większych pól możliwe jest przekroczenie stosu silnika JS przed znalezieniem ścieżki. Nie golfowany:źródło