Чтобы симулировать вторжение зомби, начните с сетки #
и представляющей карту:
## ##
### #
## ##
# ###
# ####
#
представляет землю.представляет воду.
Зомби начинаются в точке на карте ...
## ##
### #
## %#
# ###
# ####
... и распространяться. %
обозначает землю, зараженную зомби.
Однако зомби не умеют плавать . Они могут перемещаться по земле так же, как король в шахматах - один квадрат в любой диагонали или ортогональном направлении:
!!!
!%!
!!!
В конце симуляции некоторые земли будут заражены зомби:
%% ##
%%% #
%% %%
% %%%
# %%%%
Ваша задача - симулировать вторжение зомби. Напишите программу (или функцию), которая принимает в качестве входных данных строку, представляющую начальное состояние сетки, и два числа, представляющие координаты исходного зомби. Программа должна вывести (или вернуть) окончательное состояние вторжения.
Характеристики
- Ваша программа может распечатать дополнительный завершающий перевод строки.
- Вы можете предположить, что ввод будет в правильном формате (дополненный пробелами), с дополнительным завершающим переводом строки.
- Вы можете предположить, что начальный зомби начнется на земле и не умрет немедленно.
- Это код-гольф , поэтому выигрывает самый короткий ответ (в байтах).
- Бонус -100%, если ваш код также может решить проблему остановки для произвольных машин Тьюринга.
- Ваша программа должна обрабатывать доски шириной до 50 символов.
code-golf
ascii-art
simulation
Esolanging Fruit
источник
источник
Ответы:
APL (Dyalog) , 44 байта
Попробуйте онлайн!
Предполагает
⎕IO←0
.Левый аргумент: 0-индексированная строка
r
%, 0-индексированный столбецc
%:r c
Правый аргумент: матрица символов
источник
Котлин,
283218 байтБезымянная лямбда (с вложенной функцией, хе).
Golfed
Ungolfed
Сохранено немало байтов путем переключения на рекурсивное решение.
источник
JavaScript (ES6), 144 байта
Где
\n
представляет буквальный символ новой строки. Принимает 0-индексированные координаты.источник
Befunge,
324323 байтаПопробуйте онлайн!
объяснение
Реализация этого в Befunge была немного сложной, потому что мы ограничены 80x25 символами «памяти», которые должны использоваться совместно с самим исходным кодом. Хитрость в размещении карты 50х50 в этой области заключалась в том, чтобы сгладить 2D-карту в одномерный массив с двумя местоположениями карты на байт. Этот 1D массив затем снова оборачивается в 2D массив, чтобы он мог уместиться в 80 символов ширины игрового поля Befunge.
Алгоритм заражения начинается с преобразования начальных координат в смещение в массиве 1D, которое он помещает в стек. Основной цикл берет значение из стека и ищет состояние карты для этого смещения. Если это неинфицированная земля, она помечается как зараженная, и в стек помещается восемь новых смещений (представляющих землю вокруг текущей позиции). Этот процесс продолжается до тех пор, пока стек не станет пустым.
Чтобы избежать необходимости проверки значений вне диапазона, карта хранится с водной границей из одного символа по всем краям.
источник
Пип , 59 байт
Функция, которая принимает многострочную строку, строку исходного зомби (с 0 индексами) и столбец исходного зомби (с 0 индексами). Попробуйте онлайн!
Как?
Поскольку у Пипа есть циклическая индексация (обычно это хорошо, но плохо для этой проблемы, потому что мы не хотим, чтобы края карты были перенесены), я выбрал решение с заменой регулярных выражений.
Ya@?n
находит индекс первой новой строки (то есть ширину сетки) и возвращает его вy
.(ac+b+b*Ya@?n):'%
выполнив вышесказанное, вычисляет(width + 1) * row + col
, т.е.c+b+b*y
и устанавливает символ с этим индексом в%
.L2*#a
петли2*len(a)
раз, что дает нам достаточно итераций для заливки полностью распространяются и удостоверяется счетчик итераций даже (это важно)..`#(.?.?.{`.y-1.`})?%`
создает регулярное выражение, соответствующее a,#
за которым следуют%
0, ширина-1, ширина или ширина + 1 знак между ними. (В.
начале.
в регулярном выражении отображаются новые строки.) Это регулярное выражение соответствует любой из следующих конфигураций:aR ... '%.@>_
заменяет совпадения этого регулярного выражения на символ,%
добавленный перед.
всеми, кроме первого символа@>
совпадения_
; Короче говоря, заменяя#
с%
.a:RV ...
полностью изменяет это и назначает это назадa
. Мы обращаемся к обратному, потому что регулярное выражение совпадает только#
перед%
строкой, а не после; но когда строка переворачивается, after становится before, и мы можем сопоставить ее на следующей итерации. Вот почему количество итераций должно быть четным.После завершения цикла мы просто возвращаем измененное значение
a
.источник
TSQL, 267 байт
Golfed:
Ungolfed:
Попробуйте это
источник
PHP,
209189188183 байтаможет быть в гольф
Бежать с
php -r '<code>' '<grid>' <y> <x>
источник
J 152 байта
Не очень хорошо играли в гольф, я уверен, что есть способ убрать эти последние несколько контрольных структур.
Реализует алгоритм заливки. Функция g форматирует ввод в массив символов перед применением f.
Обратите внимание, что координаты немного странные:
это верхний левый угол. Увеличение первой координаты:
Перемещает позицию вниз в направлении y.
Кроме этого, координаты нормальные.
Пример:
источник