Игра «Жизнь» · Шаг 3 из 4
Поколения до повтора
«Жизнь» можно крутить вечно, но интересна она, пока меняется. Как только поле повторило то, что уже было, дальше всё пойдёт по кругу — и смотреть больше нечего. Поколения удобно отдавать по одному, генератором, — и генератор сам знает, когда остановиться.
Что сделать
Отдавайте поколения по одному и остановитесь, как только узор пошёл по кругу.
Что приходит
zhivye— живые клетки в началеshag— функция: живые клетки → живые клетки следующего поколения
Что вернуть
Генератор: отдаёт поколения начиная со следующего; повторилось бывшее — включая начальное — останавливается, не отдавая его.
Допишите функцию pokoleniya в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В игре
Игра берёт из этого генератора по поколению на каждый такт. Когда он кончается, партия окончена: «узор повторяется» или «все вымерли». Решите шаг — и игра сама остановится, когда смотреть станет не на что.
Без этого шага: поколения идут, но повтор никто не замечает — партия не кончается сама.
Одна клетка в (0, 0) падает вниз на ряд за поколение и исчезает за третьим рядом. Генератор отдаёт {(1, 0)}, {(2, 0)}, {(3, 0)}, потом пустое множество. Следующее было бы снова пустым — повтор, и генератор останавливается.
В проверке вместо правила Конвея — подмена padenie: она и двигает клетку вниз.
Функция принимает живые клетки и функцию shag (живые клетки → живые клетки следующего поколения). Отдаёт через yield поколения по одному, начиная со следующего за переданным. Как только очередное поколение совпадает с каким-нибудь из уже бывших — включая переданное, — останавливается, не отдавая его. Ничего не считает, пока у него не попросили первое поколение.
Образцовый тест целиком
def padenie(zhivye):
return {(r + 1, c) for r, c in zhivye if r < 3}
[sorted(z) for z in pokoleniya({(0, 0)}, padenie)]
[[(1, 0)], [(2, 0)], [(3, 0)], []]
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.