Простейшие клеточные автоматы

Чтобы узнать, что такое простейшие клеточные автоматы и что в них такого интересного, прочтите статью Простейшие клеточные автоматы и их практическое применение.

Задачи этого листочка не проверяются автоматически. Это одна большая задача-исследование, разбитая на подзадачи, чтобы её удобней было решать. Подзадачи нужно тестировать самостоятнльно, а результат (решения задач Е и F) прислать в виде файла с программой с расширением .py на адрес achehlova@179.ru или в telegram на адрес @achehlova.

A: Визуализация строки

Пусть имеется список из 0 и 1. Напишите функцию, которая получает на вход такой список и печатает строку, где на месте 0 будут пробелы, а на месте 1 какие-нибудь символы (например, # или @ или ещё что-нибудь).

B: Из двоичной системы — в десятичную

Напишите функцию bin_to_dec(a), которая получает на вход список из 0 и 1, интерпретирует его элементы как цифры двоичного числа и даёт на выходе соответствующее десятичное число.

C: Из десятичной системы — в двоичную

Напишите функцию dec_to_bin8(n), получающую на вход целое неотрицательное число и возвращающую список из 8 элементов — разрядов соответствующего двоичного числа, индекс элемента — это номер разряда. (Если число больше 255, то старшие биты отбрасываются).

D: Вычисляем новую строку

Напишите функцию, которая получает на вход старый список из нулей и единиц и двоичный код правила (список из 8 элементов, вычисленный функцией из задачи С), а вычисляет новый список из 0 и 1, получающийся из старого с использованием заданного правила.

Как по текущему состоянию «клетки» и её соседей вычислить её новое состояние — подробно описано в статье в разделе «Что означают коды Вольфрама» (можно использовать функцию из задачи В). Для первой «клетки» соседними будут вторая и последняя, для последней — предпоследняя и первая. Используйте функцию из задачи А для визуализации исходного и нового списков.

Исходный список можно сделать случайным с помощью функции randint из модуля random.

E: Жизнь простейщего клеточного автомата — текстовый вариант

Напишите программу, которая получает на вход номер правила и печатает заданное количество строк — последовательных состояний одномерного клеточного автомата. В качестве начального состояния можно взять единственную 1 в середине массива или случайную последовательность 0 и 1.

F: Жизнь простейщего клеточного автомата — графический вариант

Напишите программу, которая рисует последовательные состояния одномерного клеточного автомата в графическом режиме.

Можно использовать модуль drawzero или модуль tkinter. Каждое состояние 0 или 1 показывайте с помощью прямоугольника соответствующего цвета. Напишите новую функцию для визуализации текущего состояния системы вместо текстовой функции из пункта A.

Программа, рисующая один прямоугольник с использованием tkinter:

from tkinter import Tk, Canvas, mainloop

SIZE = 10  # размер прямоугольника
N = 100 # число клеток
XMAX = N * SIZE # ширина холста
YMAX = 400 # высота холста

# Создаётся графическое окно, на которое ссылается переменная root
root = Tk()

# Создаётся холст размером XMAX на YMAX, на который ссылается переменная canv
canv = Canvas(root, width=XMAX, height=YMAX, bg="lightblue")

# Холст размещается в окне
canv.pack()

# создаётся прямоугольник без обводки со стороной SIZE в точке (x, y):
x = 0
y = 0
canv.create_rectangle(x, y, x + SIZE, y + SIZE, fill="blue", width=0)

# Графическое окно выводится на экран и готово реагировать на события
root.mainloop()