Задний план
Это задание в честь апсиллеров , которые выиграли в номинации « Не все так просто, как кажется » в номинации «Лучшее из PPCG 2016», может ли моя музыкальная шкатулка с 4 нотами сыграть эту песню? Поздравляем!
На своей странице «Обо мне» у этого пользователя есть действительно изящный симулятор для клеточного автомата Game of Life . (Серьезно, иди проверь это.) С другой стороны, слово aspillera в переводе с испанского означает «стрелки». В свете этих фактов, этот вызов о стрелках в игре жизни.
Игра Жизни
В GoL мы будем представлять стрелку планером , а стену - последовательностью блоков . Единственный планер приближается к стене сверху и пытается пролететь сквозь щель в стене (освещенную стрелами). Ваша задача - проверить, проходит ли планер через освещенную стрелами или врезается в стену.
вход
Ваш вход представляет собой сетку битов, которая представляет конфигурацию GoL. Вы можете взять его в любом приемлемом формате (многострочная строка из любых двух печатных символов ASCII, список строк, двумерный массив целых чисел, двумерный массив логических значений и т. Д.). Для ясности я буду использовать многострочные строки символов .#
в следующем.
Входные данные гарантированно имеют несколько свойств. Во-первых, его высота равна 2N для некоторого N ≥ 6 , а ширина - не менее 2N + 2 . На входе будут все .
s, за исключением того, что где-то в верхних трех рядах находится планер, а в двух средних рядах есть стена блоков. Планер будет лететь на юго-запад или юго-восток, и его положение таково, что если стены будут удалены, он не пройдет через боковой край до достижения нижнего края (но может достигнуть угла сетки). Планер изначально отделен от левого и правого краев хотя бы одним шагом .
s. Это может быть на любом этапе.
Стена состоит из блоков, которые разделены одним столбцом .
s, за исключением одного места, где они будут разделены как минимум двумя столбцами .
s. Как и планер, левый и правый блоки также отделены от краев одним шагом .
s. Всегда будет по крайней мере один блок на левом краю и один блок на правом краю.
Вот пример правильной входной сетки:
....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................
Выход
Как уже говорилось, ваша задача - определить, врезается ли планер в стену или проходит к южному краю. Для целей этой задачи происходит сбой, если конфигурация больше не состоит из одного планера и стены блоков, независимо от того, что произойдет позже в симуляции. На следующих диаграммах показаны наименьшие промежутки, через которые юго-восточный планер может пройти без столкновения в двух разных фазах (условие для юго-западных планеров симметричное).
...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##
...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##
Если планер пролетает сквозь стену, вы должны вывести истинное значение, а в противном случае - ложное значение. Для приведенного выше примера правильный вывод неверен, так как планер врезается в левую часть стены.
Для целей этой задачи вы можете предположить, что если вы смоделируете GoL на входе для шагов 2 * (высота - 3) , планер находится в нижнем ряду в ожидаемом положении, а стена не повреждена, то вывод верен ,
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает самое низкое число байтов.
Контрольные примеры
Я собрал тестовые случаи в репозиторий GitHub , так как они довольно большие. Вот ссылки на отдельные файлы:
Ответы:
Python 2 ,
142136135 байтов-6 байт благодаря ElPedro
-1 байт благодаря TuukkaX
Попробуйте онлайн! или проверить все контрольные примеры
Проверка ориентации (восток / запад):
Используя,
z=p[2].index(1)
чтобы получить первый квадрат в 3-м ряду (представлен красным квадратом), а затемm=(p[1][z]-p[1][z+1]<1)*2-1
вычесть значение справа (зеленый) из значения слева (синий), таким образом, все 4 состояния планеров, которые собираются юго-западный результат в1
(верхний ряд на изображении), в то время как те, которые идут на юго-восток, приводят к0
или-1
.Затем преобразуйте:
1 -> -1
и0,-1 -> 1
используйте для параметра, чтобы изменить списки при работе с западными. Таким образом, планерам, идущим на юго-запад, угрожают так же, как планерам, идущим на юго-восток.Движение планера
Это движение, которое делает планер, движущийся на юго-восток, у него есть «лестничный» паттерн, а самый левый блок на 3-й линии постоянен для каждого паттерна. Используя его в качестве отправной точки, окружающие 3 блока слева и справа и средние 4 блока проверяются на наличие
1
s (это будет стена).источник
i
на0
внешней стороне вfor
петлю , то при добавлении 1 к ней каждый проход и так избавитьсяenumerate
. Кажется, работает, когда я попробовал это с вашим TIO. +1 за крутой ответ, прав я или нет.1 in
. +1.Октава,
123122108 байтБлагодаря @LuisMendo сэкономлено 2 байта
Попробуйте онлайн!
Или
Проверьте все контрольные примеры
Благодаря Роду, готовящему контрольные примеры.
Предыдущий ответ:
Сначала извлеките рисунок стены как переменную
B
.Выполняйте симуляцию GoL, пока рисунок стены и имитированный рисунок не будут иметь более / менее 5 различных ячеек.
Если планер получил последнюю строку, функция возвращает true.
источник
Retina ,
1019391 байтКоличество байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
Конечно, еще не оптимально.
источник