Задний план
Это задание в честь апсиллеров , которые выиграли в номинации « Не все так просто, как кажется » в номинации «Лучшее из PPCG 2016», может ли моя музыкальная шкатулка с 4 нотами сыграть эту песню? Поздравляем!
На своей странице «Обо мне» у этого пользователя есть действительно изящный симулятор для клеточного автомата Game of Life . (Серьезно, иди проверь это.) С другой стороны, слово aspillera в переводе с испанского означает «стрелки». В свете этих фактов, этот вызов о стрелках в игре жизни.
Игра Жизни
В GoL мы будем представлять стрелку планером , а стену - последовательностью блоков . Единственный планер приближается к стене сверху и пытается пролететь сквозь щель в стене (освещенную стрелами). Ваша задача - проверить, проходит ли планер через освещенную стрелами или врезается в стену.
вход
Ваш вход представляет собой сетку битов, которая представляет конфигурацию GoL. Вы можете взять его в любом приемлемом формате (многострочная строка из любых двух печатных символов ASCII, список строк, двумерный массив целых чисел, двумерный массив логических значений и т. Д.). Для ясности я буду использовать многострочные строки символов .#
в следующем.
Входные данные гарантированно имеют несколько свойств. Во-первых, его высота равна 2N для некоторого N ≥ 6 , а ширина - не менее 2N + 2 . На входе будут все .
s, за исключением того, что где-то в верхних трех рядах находится планер, а в двух средних рядах есть стена блоков. Планер будет лететь на юго-запад или юго-восток, и его положение таково, что если стены будут удалены, он не пройдет через боковой край до достижения нижнего края (но может достигнуть угла сетки). Планер изначально отделен от левого и правого краев хотя бы одним шагом .
s. Это может быть на любом этапе.
Стена состоит из блоков, которые разделены одним столбцом .
s, за исключением одного места, где они будут разделены как минимум двумя столбцами .
s. Как и планер, левый и правый блоки также отделены от краев одним шагом .
s. Всегда будет по крайней мере один блок на левом краю и один блок на правом краю.
Вот пример правильной входной сетки:
....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................
Выход
Как уже говорилось, ваша задача - определить, врезается ли планер в стену или проходит к южному краю. Для целей этой задачи происходит сбой, если конфигурация больше не состоит из одного планера и стены блоков, независимо от того, что произойдет позже в симуляции. На следующих диаграммах показаны наименьшие промежутки, через которые юго-восточный планер может пройти без столкновения в двух разных фазах (условие для юго-западных планеров симметричное).
...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##
...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##
Если планер пролетает сквозь стену, вы должны вывести истинное значение, а в противном случае - ложное значение. Для приведенного выше примера правильный вывод неверен, так как планер врезается в левую часть стены.
Для целей этой задачи вы можете предположить, что если вы смоделируете GoL на входе для шагов 2 * (высота - 3) , планер находится в нижнем ряду в ожидаемом положении, а стена не повреждена, то вывод верен ,
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает самое низкое число байтов.
Контрольные примеры
Я собрал тестовые случаи в репозиторий GitHub , так как они довольно большие. Вот ссылки на отдельные файлы: