Игра «Жизнь»
По заданным правилам, выводить на экран состояние «вселенной» в каждом поколении до конца игры. Начальное состояние (первое поколение) может генерироваться случайным образом или задаваться в коде программы (см. пример).
Правила
Место действия этой игры — «вселенная» — поле n на n клеток.
Каждая клетка на этой поверхности может находиться в двух состояниях: быть «живой» (1) или быть «мёртвой» (0). Клетка имеет восемь соседей, окружающих её.
Распределение живых клеток в начале игры называется первым поколением. Каждое следующее поколение рассчитывается на основе предыдущего по таким правилам:
в пустой (мёртвой) клетке, рядом с которой ровно три живые клетки, зарождается жизнь;
если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае, если соседей меньше двух или больше трёх, клетка умирает («от одиночества» или «от перенаселённости»)
Игра прекращается, если
на поле не останется ни одной «живой» клетки
конфигурация на очередном шаге в точности (без сдвигов и поворотов) повторит себя же на одном из более ранних шагов (складывается периодическая конфигурация)
при очередном шаге ни одна из клеток не меняет своего состояния (складывается стабильная конфигурация; предыдущее правило, вырожденное до одного шага назад)
Ограничения:
10 < n <30
Пример:
# размер вселенной «вселенной»
n = 10
# состояние «вселенной» в начале игры — первое поколение
universe = [
[0,0,0,0,0,0,0,0,0,0],
[0,1,0,0,0,0,0,0,0,0],
[0,0,1,0,0,0,0,0,0,0],
[1,1,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,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],
]
# вывод поколения на экран
print(*universe, sep="\n")