Celem tego wyzwania jest stworzenie najkrótszego kodu (w znakach), który z powodzeniem wykona następujące czynności:
Dane techniczne :
- Musisz stworzyć
5x5x5 labyrinth
dokładnie1 possible solution
(nie więcej, nie mniej) Labirynt musi zostać stworzonyMusi być w stanie wygenerować każde istniejące rozwiązanie, jeśli będzie działać przez latarandomly
start
Ifinish
muszą być umieszczone w*opposite corners
- Mapa
output
musi mieć jeden z następujących formatów:
Opcja formatu wyjściowego 1 strings, printed or alerted
:
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx
Opcja formatu wyjściowego 2 arrays
:
[[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx]]
Uwagi wyjściowe:
Użyj
0
dlaempty
i1
dlasquares
Linie przerwania NIE są konieczne
Ty decydujesz, co
index
jest co, ale po prostu dobrze to wytłumacz
* Oto przykład tego, co rozumiem przez przeciwne rogi:
Wyjaśnienia :
- NIE można się wprowadzić
diagonal
- NIE można przejść dwukrotnie tą samą ścieżką
- Posiadanie
inaccessible areas
jest dozwolone - Możesz
go up/down
więcej niż jeden poziom z rzędu
Wskazówki:
- Nie postrzegaj ich jako ścian, zamiast tego postrzegaj je jako
5x5x5
stos kwadratów, których niektórych brakuje, i możesz przejść przez te brakujące
code-golf
maze
generation
ajax333221
źródło
źródło
Odpowiedzi:
C ++C,około 1000670643395297248 znakówPrzykładowe dane wyjściowe:
Jak to działa:
program wykorzystuje Brownian Motion do generowania rozwiązań.Punkt początkowy jest ustawiony. Następnie wybierany jest losowy punkti wielokrotnie przesuwany losowo,aż dotknie jednego i tylko jednego punktu na gałęzi początkowej. Punkt jest następnie ustawiany, a jeśli dotyka on również punktu końcowego, program kończy pracę i wyświetla się macierz. Ponieważ żaden punkt nie może połączyć dwóch gałęzi, istnieje tylko jedna ścieżka przez labirynt. Program korzysta z funkcji randi argumentu liczb całkowitych wiersza poleceń jako zarodka,więc przy wystarczającej funkcji rand powinno być możliwe wygenerowanie wszystkich poprawnych labiryntów (ten algorytm nie utworzy jednak niepowiązanych obszarów, więc nie wygeneruje wszystkich możliwe labirynty).Ruch Browna został porzucony, ponieważ okazał się niepotrzebny, a jego usunięcie znacznie upraszcza kod. Sądzę jednak, że dzięki temu były ładniejsze labirynty. Podobnie zrezygnowano z argumentu źródłowego, ponieważ wymaganie bezstanowego generatora liczb losowych ma dla mnie więcej sensu niż ziarno 128-bitowe.
Możliwe jest, że program utknie w nieskończonej pętli, ponieważ jest to możliwe w sytuacjach, w których dowolny punkt dodany do gałęzi utworzyłby wiele ścieżek. Można to naprawić, ale myślę, że jest to dość rzadkie, aby nie przejmować się golfem kodowym.
Dodałem znaki nowej linii i wcięcia do wyświetlanego kodu w celu zapewnienia czytelności.
źródło
JavaScript,
874816788686682668637 znakówpróbka wyjściowa:
ten działa, zaczynając od punktu [0,0,0] i losowo dodając dołączenie jeszcze jednego 0 obok 0, gdziekolwiek jest to dozwolone (dozwolone == nowe 0 nie znajduje się obok żadnych innych zer z wyjątkiem nadawcy), dopóki nie będzie już więcej możliwe uzupełnienia.
jeśli jakieś nowe 0 znajduje się obok punktu wyjścia (x * y * z == 48), wówczas otwieramy wyjście.
grał w golfa
oryginalny
źródło
Mathematica: True Labyrinth (827 znaków)
Początkowo stworzyłem ścieżkę od {1,1,1} do {5,5,5}, ale ponieważ nie było żadnych możliwych złych zwrotów, wprowadziłem widelce lub „punkty decyzyjne” (wierzchołki stopnia> 2), w których trzeba by zdecydować, którą drogą iść. Rezultatem jest prawdziwy labirynt lub labirynt.
„Ślepe zaułki” były o wiele trudniejsze do rozwiązania niż znalezienie prostej, bezpośredniej ścieżki. Najtrudniejszą rzeczą było wyeliminowanie cykli na ścieżce, jednocześnie umożliwiając cykle poza ścieżką rozwiązania.
Poniższe dwa wiersze kodu są używane tylko do renderowania narysowanych wykresów, więc kod się nie liczy, ponieważ nie jest wykorzystywany w rozwiązaniu.
Zastosowany kod:
Próbka wyjściowa
{{„oxooo”, „xxooo”, „xoxxo”, „xoxxo”, „xxoox”}, {„ooxoo”, „xoooo”, „ooxox”, „oooxx”, „xooxx”}, {„oooxx”, „ooxxo”, „ooxox”, „xoxoo”, „xxxoo”}, {„oxxxx”, „oooox”, „xooox”, „xoxxx”, „oooxx”}, {„xxxxx”, „ooxox”, „oooox ”,„ xoxoo ”,„ oooxo ”}}
Pod maską
Poniższy obrazek pokazuje labirynt lub labirynt, który odpowiada rozwiązaniu
({{"ooxoo",...}}
przedstawionemu powyżej:Oto ten sam labirynt wstawiony w 5x5x5
GridGraph
. Ponumerowane wierzchołki są węzłami na najkrótszej drodze z labiryntu. Zwróć uwagę na rozwidlenia lub punkty decyzyjne na 34, 64 i 114. Dołączę kod użyty do renderowania wykresu, nawet jeśli nie jest on częścią rozwiązania:A ten wykres pokazuje tylko rozwiązanie labiryntu:
Na koniec kilka definicji, które mogą pomóc w odczytaniu kodu:
Oryginalne rozwiązanie (432 znaków, wyprodukowano ścieżkę, ale nie prawdziwy labirynt lub labirynt)
Wyobraź sobie dużą solidną kostkę 5 x 5 x 5 złożoną z odrębnych kostek jednostkowych. Poniższe rozpoczyna się bez kostek jednostkowych w {1,1,1} i {5,5,5}, ponieważ wiemy, że muszą być częścią rozwiązania. Następnie usuwa losowe kostki, aż do uzyskania niezakłóconej ścieżki od {1,1,1} do {5,5,5}.
„Labirynt” jest najkrótszą ścieżką (jeśli możliwa jest więcej niż jedna), biorąc pod uwagę usunięte kostki jednostek.
Przykład:
Technicznie nie jest to jeszcze prawdziwy labirynt, ponieważ nie ma żadnych złych zwrotów, które można wykonać. Ale pomyślałem, że to interesujące na początek, ponieważ opiera się na teorii grafów.
Rutyna faktycznie tworzy labirynt, ale podłączyłem wszystkie puste miejsca, które mogłyby powodować cykle. Jeśli znajdę sposób na usunięcie cykli, dołączę ten kod tutaj.
źródło
FindShortestPath
.