не получается исправить ошибку в коде на питоне, прошу о помощи
помогите пожалуйста найти ошибку в коде, он выдает ошибку выполнения. Условие задачи: Василию очень нравится клеточный автомат «Game of life», поэтому он решил попробовать придумать что-то подобное. Для простоты, Василий решил определить свой клеточный автомат на массиве из n ячеек, каждый элемент которого может быть в живом или неживом состоянии.
Эволюция массива в клеточном автомате Василия происходит итеративно следующим образом:
Если у неживого элемента есть ровно 1 живой сосед в текущем состоянии массива, то на следующей итерации он станет живым. Соседями для элемента на позиции i являются элементы на позициях i−1 и i+1 , если соседа на такой позиции не существует, то считается, что он мертв. Василий — гуманист, поэтому все живые элементы в его автомате остаются живыми. Смотрите секцию примечание для примеров эволюции.
Вам дано некоторое начальное состояние всех элементов, и вам нужно помочь Василию определить, каким будет состояние массива через m итераций эволюции.
Входные данные Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число t (1≤t≤103 ) — количество наборов входных данных. Далее следуют наборы входных данных.
Первая строка набора входных данных содержит два целых числа n и m (2≤n≤103,1≤m≤109 ) — количество ячеек в массиве и количество итераций.
Вторая строка набора входных данных содержит строку длины n из «0» и «1» — описание начального состояния. «1» обозначает живую клетку, а «0» — неживую.
Гарантируется, что сумма значений n по всем наборам входных данных не превосходит 104 .
Выходные данные Для каждого набора входных данных выведите строку из n символов «0» и «1» — состояние массива через m итераций эволюции.
Пример
входные данные
4
11 3
01000000001
10 2
0110100101
5 2
10101
3 100
000
выходные данные
11111001111
1110111101
10101
000
написала по этой задаче код, но он выдает ошибку в процессе выполнения(в 18 строке AttributeError: 'str' object has no attribute 'append'). Помогите пожалуйста исправить!!! мой код:
n=int(input())
a=["1"]
b=["0"]
for i in range(n):
kol, it=map(int, input().split(" "))
st=input()
st=st+"0"
st=list(st)
q=[]
for j in range(len(st)):
if j!=0:
if st[0]=="0":
if (st[j-1]=="1" and st[j+1]=="0") or (st[j-1]=="0" and ast[j+1]=="1"):
q.append(a)
else:
q.append(b)
else:
q.append(a)
elif j==0:
if st[j]=="0":
if st[j+1]=="1":
q.append(a)
else:
q.append(b)
else:
q.append(a)
elif j==len(st)-1:
if st[j]=="0":
if st[j-1]=="1":
q.append(a)
else:
q.append(b)
else:
q.append(a)
st=q
q=""
Очень прошу помочь!!!
Ответы (3 шт):
По-первых, вы в некоторых местах использовали оператор сравнения вместо присваивания.
Во-вторых, надо делать два списка: текущее состояние, и следующее.
В алгоритме не разбирался, может брать, в нем тоже ошибки есть.
Приведённая в вопросе ошибка возникает из-за того, что в начале вы присваиваете q список
q=[]
а в конце цикла - строку
q=""
Соответственно, на второй и последующих итерациях цикла значение q - это уже не список, а строка, у которой нет метода append.
Для количества шагов m=10^9 невозможно сделать m преобразований массива за отведенное время. Это говорит о том, что требуется полностью изменить подход.
Если посмотреть, что будет с серией из L нулей в начале или в конце, ограниченная единицей: единицы будут продвигаться на одну позицию каждый шаг. Таким образом, если m>=L, то нулей не останется, иначе останется L-m нулей.
Серия из L нулей в середине массива, ограниченная двумя единицами, будет сжиматься на каждом шаге на две позиции, так что, если 2*m<L, то останется L-2*m нулей, иначе останется L&2 нулей (т.е. при нечетной длине один ноль будет неубиваемым)
Сложность этого решения O(n), т.е. пропорциональна длине входных данных, которая совсем невелика (1000)