не получается исправить ошибку в коде на питоне, прошу о помощи

Рейтинг: -1Ответов: 3Опубликовано: 01.04.2023

помогите пожалуйста найти ошибку в коде, он выдает ошибку выполнения. Условие задачи: Василию очень нравится клеточный автомат «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=""

Очень прошу помочь!!!

Ответы

▲ 1

Для количества шагов m=10^9 невозможно сделать m преобразований массива за отведенное время. Это говорит о том, что требуется полностью изменить подход.

Если посмотреть, что будет с серией из L нулей в начале или в конце, ограниченная единицей: единицы будут продвигаться на одну позицию каждый шаг. Таким образом, если m>=L, то нулей не останется, иначе останется L-m нулей.

Серия из L нулей в середине массива, ограниченная двумя единицами, будет сжиматься на каждом шаге на две позиции, так что, если 2*m<L, то останется L-2*m нулей, иначе останется L&2 нулей (т.е. при нечетной длине один ноль будет неубиваемым)

Сложность этого решения O(n), т.е. пропорциональна длине входных данных, которая совсем невелика (1000)

▲ 0

По-первых, вы в некоторых местах использовали оператор сравнения вместо присваивания.

Во-вторых, надо делать два списка: текущее состояние, и следующее.

В алгоритме не разбирался, может брать, в нем тоже ошибки есть.

▲ 0

Приведённая в вопросе ошибка возникает из-за того, что в начале вы присваиваете q список

q=[]

а в конце цикла - строку

q=""

Соответственно, на второй и последующих итерациях цикла значение q - это уже не список, а строка, у которой нет метода append.