Так как завтра 4 мая, вот небольшой пост на тему «Звездных войн», чтобы мысленно подготовить вас ко всем плохим шуткам, которые появятся завтра.
предыстория
Во время сессии галактического сената все сенаторы сидят в n*n
сетке. Внезапная вспышка гриппа JarJar (которая длится вечно и заставляет зараженных говорить как JarJar Binks) вызывает заражение некоторых сенаторов.
Вот пример с 6*6
сеткой, где X
зараженные сенаторы, соответствующий список [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[0,5]]
:
После этого инфекция начинает распространяться шаг за шагом. Два сенатора являются смежными, если они имеют общий край сетки (т. Е. Сверху, снизу, справа, слева), что означает, что мы исключаем диагонали.
Мы можем заключить, что сенатор может быть соседним с 2,3 или 4 другими сенаторами и требовать следующие правила заражения:
- Зараженный сенатор остается зараженным навсегда
- Сенатор заражается на шаге, если он был рядом с 2 или более зараженными сенатором на предыдущем шаге
Вот пример с предыдущей сеткой, которая показывает 2 первых шага заражения:
После следующих шагов весь сенат будет заражен
ТВОЕ ЗАДАНИЕ
Ваш код не должен обрабатывать неверные данные, такие как список больше n*n
или координаты, которые не являются отличительными.
Ваш код будет принимать в качестве входных данных список пар целых чисел (или двоичной сетки или любого другого формата, который подходит вашему языку) и целое число n
(которое может быть ненужным, если вы используете другой формат, чем список), например:
8 [[1,2],[1,1],[7,4],[2,7],[4,3]]
n является стороной сетки, что означает, что сетка будет * n сеткой, а список пар целых чисел будет координатами ячеек изначально зараженных сенаторов.
Нижний левый угол сетки [0,0], а верхний правый - [n-1, n-1]. Слева вверху - [0, n-1].
Ваш код должен вывести целое число:
-1
или ложное значение или ошибка, если вся сетка никогда не будет полностью заражена, или минимальное количество шагов, необходимых для заражения всей сетки
Контрольные примеры
6 [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]] => 7
4 [[1,1][0,3][1,0][3,0][3,3]] => 9
Помните, что это код-гольф , поэтому выигрывает самый короткий ответ в байтах!
n
? Есть ли максимальное значение?CellularAutomaton
...Ответы:
MATL,
2928 байтВвод в виде двумерной матрицы 1 и 0
Попробуйте это на MATL Online
объяснение
источник
tn:"tlY6Z+1>Z|t?x@D.]]N?xl_
? (Я не проверял много). Если в какой-то момент все элементы равны 1, немедленно отобразите индекс цикла и удалите стек. В конце цикла, если стек не пуст, удалите и нажмите-1
APL (Dyalog 16.0), 54 символа или 60 байтов
Принимает вложенную матрицу в качестве аргумента, возвращает номер шага, который завершает заражение, т.е. 1 = уже полностью заражен. 0 = не распространяется полностью, это всего лишь 1 + номера ОП.
54 символа (Unicode):
60 байтов (классический):
⌺
эквивалентно⎕U233A
Примеры запуска:
Шаги следующие:
источник
Pyth , 49 байтов
Тестовый пакет .
Использует 1-индексирование для вывода.
источник
Python, 231 байт
Возникает ошибка, если это невозможно.
Попробуйте онлайн!
источник
0/0
сохраняет два байта изraise
. Может1/(g!=h)
сработает? (тогда целоеwhile
тоже может быть встроено).q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0
сохраняет 12. Вы можете удалить пространство между (а)1
иfor
и (б)]
иfor
тоже.JavaScript (ES6), 132 байта
Где
\n
представляет буквальный символ новой строки. Принимает ввод в виде строки0
s и1
s в массиве с разделителями новой строки. Возвращает,NaN
если сетка никогда не станет полностью зараженной.источник