Клеточный автомат "Жизнь" (4)
Клеточный автомат "Жизнь"
Реализуйте клеточный автомат “Игра Жизнь”. Подробное описание смотрите здесь.
Правила игры (для данной задачи)
- Место действия игры - двумерный массив размерности
(M, N)
. - Каждая клетка - т.е. ячейка массива - может находиться в двух состояниях: быть живой или мёртвой.
- Клетка имеет восемь соседей, окружающих её.
- Следующий шаг рассчитывается в зависимости от текущего состояния по следующим правилам:
- Жизнь зарождается в пустой клетке, если рядом с ней ровно ровно три других живых клетки
- Если у живой клетки две или три живые соседки, то она продолжает жить, иначе умирает.
- Игровое поле зациклено по вертикали и по горизонтали. Например, клетка
(k, N - 1)
является соседкой клетки(k, 0)
.
(взято с Википедии)
Задание
Необходимо реализовать единственную функцию step
в файле life.py
.
- Функция принимает один аргумент - текущее состояние игры - двумерный массив
numpy
, в ячейках которого лежитTrue
, если соответствующая клетка жива, илиFalse
, если мертва. - Функция должна возвращать массив такой же размерности с состоянием игры на следующем шаге.
- Работать с массивом нужно в векторизованном виде, т.е. используя встроенные функции и методы numpy. Не рекомендуется использовать в явном виде циклы по массиву, т.к. это значительно медленнее первого способа.
Проверить правильность работы функции можно в life.ipynb
. Также там имеется код для рисования анимации и примеры некоторых простых структур.
Постройте дополнительно две любые чем-либо интересные структуры (например, осцилляторы, планеры или фабрики) в life.ipynb
.
Тестирование
Запустить автоматические тесты можно так:
python -m pytest -sv
Если тесты показывают Failed: Timeout
, значит ваша функция step
работает недостаточно быстро. Подумайте, как можно её оптимизировать (см. пункт 3 в задании).