tło
Jesteś uczniem potężnego czarodzieja, a twój mistrz obecnie opracowuje zaklęcie do tworzenia międzywymiarowego labiryntu, aby uwięzić swoich wrogów. Chce, abyś zaprogramował swój komputer napędzany parą, aby analizował możliwe układy. Programowanie tej diabelskiej maszyny jest bardzo niebezpieczne, więc będziesz chciał, aby kod był jak najkrótszy.
Wkład
Twój wkład jest dwuwymiarową siatką kropek .
i skrótów #
, oznaczającą pustą przestrzeń i ściany, podaną jako ciąg rozdzielany znakiem nowej linii. Zawsze będzie co najmniej jeden .
i jeden #
, i możesz zdecydować, czy jest końcowy znak nowej linii, czy nie.
Ta siatka jest planem nieskończonego labiryntu, który powstaje przez wyrównanie nieskończenie wielu kopii siatki obok siebie. Labirynt jest podzielony na wnęki , które są połączonymi komponentami pustych przestrzeni (przestrzenie sąsiadujące ze sobą po przekątnej nie są połączone). Na przykład siatka
##.####
...##..
#..#..#
####..#
##...##
skutkuje następującym labiryntem (kontynuowanym nieskończenie we wszystkich kierunkach):
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
Ten szczególny labirynt zawiera wgłębienie nieskończonego obszaru. Z drugiej strony ten plan daje labirynt z tylko skończonymi wnękami:
##.####
##..###
####...
..####.
#..####
Wydajność
Twój wynik powinien być prawdziwą wartością, jeśli labirynt zawiera nieskończoną wnękę, a wartość fałszu, jeśli nie. Zauważ, że labirynt może zawierać zarówno skończone, jak i nieskończone wnęki; w takim przypadku dane wyjściowe będą zgodne z prawdą.
Zasady
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Dodatkowe przypadki testowe
Nieskończone wgłębienia:
.#
#.#
...
#.#
#.###.#.###.#
#.#...#...#.#
#.#.#####.#.#
..#.#...#.#..
###.#.#.#.###
#...#.#.#...#
#.###.#.###.#
##.###
#..###
..##..
###..#
##..##
..#..#..#..#..#..#
.#..#..#..#..#..#.
#..#..#..#..#..#..
#.####.###.###.####
#...#..#...###..###
###.#..#.######..##
....####.#######...
###..###...########
##########.##....##
..###......##.##...
#.........##..#####
###########..###..#
#...........####..#
#.###########.##..#
#.##....##.....####
#.####.###.###.####
Skończone wnęki:
###
#.#
###
.#
#.
####
.#..
####
#.#.#
..#..
#####
..#..
#.#.#
#.#.#.#.#.#
..#...#.#..
###.###.###
..#.#......
#.#.#######
#.#.......#
#.#######.#
#.#.....#.#
#.#.#.#.#.#
##....#####
.#..#...##.
.##.#..#...
..###.###..
#..##.#####
#...##....#
#.#.#####.#
###..####.#
....####...
###...#####
###....##.#########
####...##....#...##
..####.#######.###.
....##..........##.
###..#####.#..##...
####..#..#....#..##
..###.####.#.#..##.
..###...#....#.#...
..####..##.###...##
#.####.##..#####.##
####...##.#####..##
###########
........#..
#########.#
..........#
.##########
.#.........
##.########
...#.......
.
i jeden#
.Odpowiedzi:
JavaScript (ES6), 235
253Ta sama metoda stosowana przez @mac. Dla każdej wolnej komórki próbuję wypełnić rekurencyjnie, zaznaczając używane komórki współrzędną, której używam (która może znajdować się poza pierwotnym szablonem). Jeśli podczas wypełniania dojdę do komórki oznaczonej już inną współrzędną, jestem na nieskończonej ścieżce.
Ekscentryczny sposób obsługiwać modulo w JS to dość irytujące.
Przetestuj w konsoli Firefox / FireBug
Nieskończony
Wydajność
Skończone
Wydajność
źródło
(j%4-1)%2
daje ładny powtarzalny wzór.L=
bajtów.C # -
423375 bajtówKompletny program w języku C #, akceptuje wprowadzanie danych przez STDIN, w razie potrzeby przekazuje STDOUT „True” lub „False”.
Nie mogłem się powstrzymać przed pozostawieniem tam Linq ... na szczęście jego usunięcie się opłaciło! Teraz śledzi widoczne i odwiedzane komórki w tablicy (biorąc pod uwagę, że i tak tylko przegląda ich skończoną liczbę). Ponownie napisałem kod kierunkowy, eliminując potrzebę korzystania z Lambda i ogólnie czyniąc kod trudniejszym do zrozumienia (ale przy znacznych oszczędnościach bajtów).
Jest to pierwsze wyszukiwanie (nie ma to znaczenia), które trwa, dopóki nie utknie w skończonej jaskini lub zdecyduje, że jest ona na tyle duża, że musi być nieskończenie duża (gdy ma tyle komórek, ile oryginalny prostokąt, oznacza to, że musi istnieć ścieżka z jednej komórki do siebie gdzieś indziej, którą będziemy mogli podążać wiecznie).
Nieprzetworzony kod:
źródło
C#
odpowiedź jako najlepszy głosujący.Python 2 -
258210244 bajtówRekurencyjnie sprawdzaj ścieżki, jeśli przepełnienie stosu zwraca 1 (prawda), w przeciwnym razie zwraca Brak (falsey).
źródło
;
dla linii wp
, ponieważ dostaniesz je w tej samej linii zif
.Python 2 -
297286275 bajtówWybiera dowolną „otwartą” komórkę, aby rozpocząć wypełnianie zalewowe. Labirynt jest nieskończony, jeśli podczas wypełnienia ponownie odwiedzimy komórkę, którą już odwiedziliśmy, ale ma inną współrzędną niż poprzednia wizyta. Jeśli wypełnienie powodziowe wypełni cały region bez znalezienia takiej komórki, wypróbuj inny region. Jeśli takiego regionu nie można znaleźć, labirynt jest skończony.
Pobiera plik do przetworzenia w wierszu poleceń, zwraca kod wyjścia
1
dla nieskończoności i0
dla skończonego.Zwraca prawidłowe wyniki dla wszystkich przypadków testowych.
źródło