tło
To wyzwanie jest na cześć apsillerów , którzy wygrali kategorię Nie tak proste, jak to wygląda w Best of PPCG 2016 z ich wyzwaniem Czy moja 4-nutowa pozytywka może odtworzyć tę piosenkę? Gratulacje!
Na stronie „About Me” ten użytkownik ma naprawdę fajny symulator automatu komórkowego Game of Life . (Poważnie, sprawdź to.) Z drugiej strony słowo aspillera jest po hiszpańsku „podświetlany strzałkami”. W świetle tych faktów to wyzwanie dotyczy strzelnic w Game of Life.
Gra w strzały
W GoL będziemy reprezentować strzałę szybowcem , a ścianę sekwencją bloków . Pojedynczy szybowiec zbliża się do ściany z góry i próbuje przelecieć przez szczelinę w ścianie (podświetloną strzałką). Twoim zadaniem jest sprawdzenie, czy szybowiec przechodzi przez podświetlony strzałkę lub uderza w ścianę.
Wkład
Twój wkład to siatka bitów, która reprezentuje konfigurację GoL. Możesz wziąć go w dowolnym rozsądnym formacie (wieloliniowy ciąg dowolnych dwóch odrębnych drukowalnych znaków ASCII, lista ciągów, tablica liczb całkowitych 2D, tablica boolanów 2D itp.). Dla jasności użyję wieloliniowych ciągów znaków .#
poniżej.
Wejście ma zagwarantowane kilka właściwości. Po pierwsze, jego wysokość wynosi 2N dla niektórych N ≥ 6 , a szerokość wynosi co najmniej 2N + 2 . Dane wejściowe będą .
s, z wyjątkiem tego, że gdzieś w trzech górnych rzędach znajduje się szybowiec, a w dwóch środkowych rzędach jest ściana bloków. Szybowiec będzie kierował się na południowy zachód lub południowy wschód, a jego położenie będzie takie, że jeśli ściany zostaną usunięte, nie przejdzie on bocznej krawędzi przed osiągnięciem dolnej krawędzi (ale może dotrzeć do rogu siatki). Szybowiec jest początkowo oddzielony od lewej i prawej krawędzi co najmniej jednym krokiem .
s. Może być w dowolnej fazie.
Ściana składa się z bloków, które są oddzielone jedną kolumną .
s, z wyjątkiem jednego miejsca, w którym będą oddzielone co najmniej dwiema kolumnami .
s. Podobnie jak szybowiec, skrajne lewe i prawe bloki są również oddzielone od krawędzi o jeden stopień .
s. Zawsze będzie przynajmniej jeden blok na lewej krawędzi i jeden blok na prawej krawędzi.
Oto przykład prawidłowej siatki wejściowej:
....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................
Wydajność
Jak powiedziano, Twoim zadaniem jest ustalenie, czy szybowiec uderzy w ścianę, czy przebije do południowej krawędzi. Na potrzeby tego wyzwania następuje awaria, jeśli konfiguracja nie składa się już z jednego szybowca i ściany bloków, niezależnie od tego, co stanie się później w symulacji. Poniższe diagramy pokazują najmniejsze szczeliny, przez które szybowiec południowo-wschodni może przejść bez zderzenia w dwóch różnych fazach (warunek dla szybowców południowo-zachodnich jest symetryczny).
...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##
...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##
Jeśli szybowiec przeleci przez ścianę, wypiszesz prawdziwą wartość, a w przeciwnym razie wartość fałszu. W powyższym przykładzie prawidłowym wyjściem jest fałsz, ponieważ szybowiec uderzy w lewą część ściany.
Na potrzeby tego wyzwania możesz założyć, że jeśli symulujesz GoL na wejściu dla 2 * (wysokość - 3) kroków, szybowiec znajduje się w dolnym rzędzie w oczekiwanej pozycji, a ściana jest nienaruszona, to wynik jest prawdziwy .
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów.
Przypadki testowe
Zebrałem przypadki testowe do repozytorium GitHub , ponieważ są one dość duże. Oto linki do poszczególnych plików: