Wiem, że istnieje (stary) wątek podobny do tego ( tutaj ), ale chciałbym go ponownie uruchomić z pewnymi modyfikacjami.
Cel: wygenerować losowo wyglądający labirynt przy użyciu wybranego algorytmu, a następnie wyprowadzić labirynt graficznie (liczba wydruków się liczy).
- Szerokość i wysokość są określane przez Ciebie.
- Powinna istnieć co najmniej jedna ścieżka od co najmniej jednego wejścia do co najmniej jednego wyjścia.
- Format labiryntu (sposób jego wyświetlania, oznaczania wejść lub wyjść) zależy również od Ciebie.
- Im ładniejsze, tym lepiej.
- Trywialne labirynty (np. Labirynty puste, labirynty kratowe, labirynty wielkości 1x1) są odradzane.
- Cykle w labiryncie są dozwolone i są zachęcane, jeśli wynik jest rozsądny.
- Zachęcanie do nadużywania języka.
- Labirynt powinien wyglądać na dość losowy (ale całkowicie deterministyczny (np. Chaotyczny) algorytm, który to generuje, też jest w porządku).
Edycja: główny nacisk kładziony jest tutaj na jak najmniejszą implementację. Chcę jednak pozwolić sobie na pewną swobodę w ramach tego ograniczenia, aby zachęcić do lśnienia. Celowo pozostawiłem dokładnie to, co „cechy” labiryntu mają otwarte, ale jako ogólną wytyczną powinieneś spróbować spakować jak najwięcej huku w najmniej leksykalne pieniądze.
code-golf
popularity-contest
maze
imallett
źródło
źródło
Odpowiedzi:
C:
265253 bajtów(Wymagany terminal z 65 znakami) Generuje stosunkowo losowy labirynt 31x31 z jedną gwarantowaną ścieżką od wejścia do wyjścia.
Przykładowe dane wyjściowe (z symulowanym terminalem o długości 65 znaków):
źródło
int p,int c
.p,c
wystarczy ...Mathematica,
144132 bajtyOd momentu powstania wszyscy znamy najskuteczniejszy sposób narysowania labiryntu .
Dane wyjściowe bez golfa i przykład:
Oczywiście linie to ściany. Jesteś minotaurem, który zaczyna się w centrum i musi się wydostać.
źródło
C: 364 bajtów
Uwaga: powyżej, dodałem nowe wiersze, aby zmieściły się na stronie. Oczekiwany wynik (na 80-znakowym terminalu) (nuty zaczynają się i kończą w lewym górnym rogu):
źródło
Mathematica,
134130 znakówW rzeczywistości możemy użyć tego algorytmu do wygenerowania labiryntu z dowolnego (niekierowanego) wykresu.
Na przykład wygeneruj labirynt z wykresu trasy rycerskiej 8 * 8 (
KnightTourGraph[8,8]
):źródło
Bash, 53 bajty
Podobny pomysł do kodu C64. Używa znaków Unicode jako ukośników, ponieważ wyglądają znacznie ładniej w terminalu obsługującym Unicode. Przykładowe dane wyjściowe na terminalu OS X (czcionka Menlo):
źródło
yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash
. Zobacz ten postJavaScript (ES6), 174
To budowniczy labiryntu, którego użyłem w tym innym wyzwaniu , właśnie grałem w golfa. Jest to funkcja z 2 parametrami: wierszami i kolumnami. Labirynt jest całkowicie połączony bez pętli, więc dowolna lokalizacja może być punktem początkowym lub końcowym.
Przykład
Wydajność
Test
źródło
ZX Basic - 54 znaki
Oto labirynt pokazujący trasę przez nią (odstępy między liniami)
i mały fragment z pierwszej chwili (kilka lat temu) i spędziłem trochę czasu na ulepszaniu grafiki.
źródło
BBC BASIC, 18 bajtów
Poprawiono długość 23-bajtowej wersji nieskończonej pętli C64 autorstwa @nneonneo. VDU wysyła pojedynczy znak do kontrolera VDU: albo 2 + 1 * 45 = ASCII 47,
/
albo 2 + 2 * 45 = ASCII 92\
BBC BASIC, 35 bajtów /
10795 bajtów35 bajtów jest tylko dla ostatniej linii, co daje labirynt o 25 rzędach w układzie 40 kolumn. MODE1 zapewnia, że między wierszami nie pozostanie żadna dodatkowa przestrzeń. Pozostała część programu jest opcjonalna i poprawia formatowanie. Instrukcje VDU23 redefiniują czcionkę dla znaków 47 i 92 (8 bajtów tworzących bitmapę 8 x 8). Zawieram lekki piksel we wszystkich czterech rogach, aby nie dopuścić do zerwania prostych przebiegów. Efektem ubocznym jest to, że kropka pojawia się w pustych diamentach. Łącznie 107 bajtów, w tym 2 nowe znaki.
Edytuj ten program można skrócić do 95 bajtów, kodując niektóre 8-bitowe kody VDU do 16-bitowych małych wartości endianowych (oznaczonych średnikiem po nich zamiast przecinkiem) i reprezentując instrukcję MODE jako parę kodów VDU, w następujący sposób .
Wydajność
Korzystanie z BBC Basic dla Windows z bbcbasic.co.uk
Tylko ostatni wiersz, 35 bajtów
Cały program,
10795 bajtówJak skomentowałem odpowiedź @ Briana, ukośnik dzieli kwadrat na 2 ciemne trójkąty, z których każdy ma dokładnie 2 wejścia / wyjścia. To gwarantuje (trywialną, nierozgałęzioną) ścieżkę z dowolnego punktu na skraju labiryntu do innego punktu na krawędzi labiryntu. Wiele z nich jest bardzo krótkich, ale zawsze wydaje się, że jest kilka długich. Oczywiście na środku labiryntu są też pętle.
Ponieważ inne odpowiedzi o tym nie wspominały, chciałbym dobrze przyjrzeć się jasnym obszarom. Są one ograniczone ciemnymi obszarami, dlatego w następstwie powyższego stwierdzenia jasny obszar ograniczony zewnętrznie przez N ciemnych obszarów dotyka krawędzi pola w punktach N (dokładnie tyle). Dlatego pojawiają się dość duże jasne obszary, które tworzą interesujące, rozgałęzione labirynty.
W poniższym przykładzie możesz zobaczyć surowe wyjście (monochromatyczne) z mojego programu. Poniżej (używając Windows Paint) dwa najdłuższe ciemne obszary pokolorowałem na niebiesko. Następnie pokolorowałem największy jasny obszar na żółto, a dwa obszary ograniczone przez niebieski na czerwono i zielono. Żółte, zielone (a nawet czerwone) labirynty są dość interesujące i nietrywialne.
EDYCJA - Automatyczne wybieranie labiryntów i wybór początku / końca
Dla jeszcze jednej linii (59 znaków) program może automatycznie wybrać do 6 labiryntów, wybierając losowo kwadraty i zalewając kolory: czerwony, zielony, żółty, niebieski, magenta i cyjan. Nie zawsze znajduje pełne 6, ponieważ jeśli wybierze losowy kwadrat, który został już pokolorowany, nic nie robi.
Pozostała część kodu poniżej określa początek każdego koloru, skanując każdą kolumnę od góry do dołu oraz od lewej do prawej i wybierając pierwszy napotkany kwadrat. Wybiera koniec, skanując w przeciwnym kierunku.
To tworzy zestaw kolorowych, splecionych labiryntów. Czasami są tak splecione, że wygląda na to, że labirynty muszą gdzieś przejść. Ale oczywiście nie!
Dodatkowy kod i wynik 59 + 187 = 246 dodatkowych znaków, które należy dodać na końcu oryginalnego programu (w celu rozszerzenia poza specyfikację pytań)
źródło
C: 235 bajtów
Uwaga: powyżej, dodałem nowe wiersze, aby zmieściły się na stronie. Oczekiwany wynik (na terminalu 80-znakowym):
Żałuję, że nie jest to zbyt trudny labirynt (w rzeczywistości nie jest wymagane cofanie się do pierścieni wewnętrznych (i powinieneś być w stanie znaleźć ścieżkę od obwodu do centrum w sposób trywialny). Jednak ma fajną implementację koła Bresenhama algorytm rysowania w jego rdzeniu.
źródło
i+=2
sięi+=3
, może to być bardziej jasne, co się dzieje.Pomogłem mojemu dziecku to zrobić, nauczyć się programowania: http://jsfiddle.net/fs2000/4KLUC/34/ jak ci się podoba?
źródło
Commodore 64 BASIC - 38 bajtów
To nie jest mój wynalazek, po prostu powtarzam bardzo piękny i krótki program z minionych dni. W rzeczywistości istnieje cała książka o nazwie
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
świętująca ten fragment kodu!Możesz zobaczyć wynik na tym filmie na YouTube ; oto zrzut ekranu:
Tutaj, w tym pytaniu StackOverflow, znajduje się więcej implementacji tego programu do generowania labiryntów. Najkrótszą implementacją programu jest następujący 23-bajtowy program C64 BASIC opublikowany przez autora tego pytania:
gdzie małe litery są wprowadzane bez zmian, a wielkie litery są wprowadzane za pomocą klawisza Shift (mają one inny wygląd na rzeczywistym ekranie C64).
źródło
Java: 700
Oto rekursywny dodatek do ściany. Algorytm jest opisany na tej stronie :
Zasadniczo dzieli każdy prostokąt na pół ścianą (i przejściem), a następnie dzieli je na dwie części itp. Generuje „idealny” labirynt - jeden bez cykli - który ma ścieżkę z każdego punktu do każdego innego punktu. Mnóstwo ślepych zaułków, więc nie jest w żadnym sensie „trywialna” dla większych labiryntów.
Tak więc wejście i wyjście można ustalić dowolnie. Jeśli będę musiał wybrać jeden, powie tylko górny / lewy i dolny / prawy.
Jest rysowany w ascii o podwójnej szerokości, więc dobrym pomysłem jest przesyłanie danych wyjściowych do pliku, jeśli wykonujesz dowolną dowolną wielkość. Oto konsola 20x20:
I 100x100 w notatniku ++ (musiałem pomniejszyć, aby dostać wszystko, więc jest trochę ... mały ):
Kod z podziałem wiersza:
źródło
ZX Basic - 281 znaków
To bardziej „właściwy” labirynt, mniej golfisty, ale bardziej mazera. Tak zwany algorytm Binary labirynt, każda komórka może mieć wyjście schodzące lub w prawo, ale nie jedno i drugie. (Teraz zawiera oznaczony Początek „S” i Koniec „E”, aby zapobiec prostemu poruszaniu się po jednej stronie).
„::” to sposób wprowadzania znaków graficznych Spectrum do pliku tekstowego przez ZXB, co odpowiada sprzedanemu znakowi blokowemu.
źródło
C-244
Oto jak to wygląda:
Uwaga: to rozwiązanie jest inspirowane niezaufanym poziomem gry 8: w lesie.
źródło