Жизнеподобные клеточные автоматы - это клеточные автоматы, которые похожи на игру жизни Конвея в том, что они действуют на (теоретически) бесконечно большой квадратной сетке, где каждая клетка имеет ровно 8 соседей и является одним из 2 состояний, а именно живым и мертвым ,
Тем не менее, эти версии, подобные «Лайк», принципиально отличаются друг от друга: правила оживления данной клетки и правила выживания данной клетки для следующего поколения.
Например, классическая Игра Жизни использует правило B3/S23
, означающее, что для рождения новой требуется 3 живых клетки, а для выживания 2 или 3 живых соседа. Для этой задачи мы будем предполагать, что соседи не включают себя, поэтому каждая ячейка имеет ровно 8 соседей.
Ваша задача, учитывая исходную конфигурацию, правило рождения, правило выживания и положительное целое число (количество поколений, которое нужно запустить), имитировать Life-like автомат с использованием этих правил для числа поколений, указанных в кратчайшем из возможных кодов. , Начальной конфигурацией будет квадратная матрица / двумерный массив или многострочная строка, которую вы можете выбрать. Другие могут быть предоставлены в любом разумном формате и метод.
Например, если правило рождения было 12345678
(любые живые соседи), правило выживания было, 2357
и начальная конфигурация была
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
следующие два поколения будут
Generation 1: Generation 2:
0 0 0 0 0 1 1 1 1 1
0 1 1 1 0 1 1 0 1 1
0 1 0 1 0 1 0 1 0 1
0 1 1 1 0 1 1 0 1 1
0 0 0 0 0 1 1 1 1 1
Если бы число приведенных поколений было 10, на выходе было бы что-то вроде
0 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
0 1 1 1 0
Вам не нужно обрабатывать изменения, которые происходят за пределами границ, заданных входной матрицей, однако все ячейки за пределами матрицы начинаются мертвыми. Поэтому матрица ввода может быть любого размера, вплоть до максимального значения, которое может поддерживать ваш язык. Вам не нужно выводить доску между поколениями.
Это код-гольф, поэтому выигрывает самый короткий код.
Контрольные примеры
Они используют B/S
обозначение, чтобы указать используемые правила
B2/S2
, generations = 100
Конфигурация:
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
Выход:
0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
1 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
B1357/S2468
, generations = 12
Конфигурация:
1 0 1 0 1 0
0 1 1 0 1 0
1 0 0 0 0 0
0 0 0 0 0 1
1 1 1 1 1 0
0 1 1 0 0 1
Выход:
0 1 0 0 0 0
0 1 1 1 1 0
0 1 0 1 1 0
1 1 1 0 0 0
0 0 1 1 1 0
0 1 1 0 0 0
Если вам нужно создать больше тестовых случаев, вы можете использовать этот замечательный симулятор. Пожалуйста, не забудьте ограничить размер доски
Ответы:
MATL ,
2423 байтаВходы:
;
качестве разделителя строк.Попробуйте онлайн! Или посмотрите тестовые случаи: 1 , 2 .
Еще на несколько байтов вы можете увидеть эволюцию в искусстве ASCII .
объяснение
источник
xx
начале мне кажется немного расточительным ...Wolfram Language (Mathematica) ,
144122 байтаПопробуйте онлайн!
Пример использования:
использует случайную сетку 10x10 в качестве начала, выживает с 2 или 3 соседями, рожает с 3 соседями, строит результат за 5 итераций.
источник
R , 256 байт
Попробуйте онлайн!
К сожалению, это выглядит не так, как я надеялся.
Входные данные : матрица R и параметры вызова. Вывод : матрица после R поколений.
Алгоритм дополняет матрицу нулями для обработки границ. Затем, итеративно: 1) применяет правило рождения и 2) убивает уже существующие ячейки, которые не прошли правило выживания. Обивка удаляется при возврате.
источник
216
крайней мере, с кубом ...Python 2 ,
156,149,146 байт.Попробуйте онлайн!
Принимает участие:
R
[birth,survial]
правила : список правилstring
. например.(['135','246']
)g
enerations:int
c
конфигурация: квадратный 2D массив1/0
илиTrue/False
Возвращает 2d массив
True/False
источник