C++ и Python

Клеточный автомат "Жизнь" (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 в задании).