Ошибка "index out of range" при проверке позиции символов после split

Возникла ошибка с функцией (index out of range), хотя в список ends добавляю значения явно меньшие чем len(el). Дли примера обрабатываю маленькую строчку s

введите сюда описание изображения

Вообще задача под регулярные выражения придумана, но их не умею.

Попытался хоть как-то выстроить алгоритм:

  • после сплита на корректные выражения (parts) разделил их по плюсам, брал части их до куска, когда последняя цифра не удовлетворяла условию и пытался взять символов от каждого полученного куска по максимуму, отрезая последний неподходящий (в while), но именно в нем, отсылающемся к функции is_ok происходит ошибка :(

https://kompege.ru/files/n1m8MdaKVI.txt Это задание 22235 с сайта КЕГЭ

def is_ok(el):
    for j in range(len(el)):
        if el[j] == '*':
            ends.append(j)
    ends.append(len(el))

    # zero_pl = []
    # if el[0] == '0':
    #     zero_pl.append(0)

    # for j in range(len(el) - 1):
    #     if el[j:j + 2] == '*0':
    #         zero_pl.append(j + 1)

    udovl = [el[h] in '024568' for h in [l - 1 for l in ends]]
    return all(udovl)


s = open('24_22235.txt').readline().strip()

s = '12*0*111111321+1111*32*12*0*15+12*2'
bad_pairs = [('++', '+ +'), ('**', '* *'), ('+*', '+ *'), ('*+', '* +')]
for el in bad_pairs:
    while el[0] in s:
        s = s.replace(el[0], el[1])

for e in range(10):
    while f'*0{e}' in s:
        s = s.replace(f'*0{e}', f'*0 {e}')
    while f'+0{e}' in s:
        s = s.replace(f'+0{e}', f'+0 {e}')
s = s.split()

for i in range(len(s)):
    while s[i] and s[i][0] in '+*':
        s[i] = s[i][1:]
    while s[i] and s[i][:2] in [f'0{a}' for a in range(10)]:
        s[i] = s[i][1:]
    while s[i] and s[i][-1] in '+*':
        s[i] = s[i][1:]
s.sort(reverse=True, key=len)

m = 0
for part in s:
    print(part)
    c = 0
    part = part.split('+')

    for el in part:
        tryes = []
        bad_th = []

        ends = []
        for j in range(len(el)):
            if el[j] == '*':
                ends.append(j)
        ends.append(len(el))

        if el:
            if el[0] == '0' or '*0' in el:

                # zero_pl = []
                # if el[0] == '0':
                #     zero_pl.append(0)
                # for j in range(len(el)-1):
                #     if el[j:j+2] == '*0':
                #         zero_pl.append(j+1)

                udovl = [el[h] in '024568' for h in [l - 1 for l in ends]]
                print(udovl)
                moment = 0
                for v in range(len(udovl)):
                    if udovl[v] == False:
                        tryes.append(el[moment:ends[v]])
                        moment = ends[v]+1
                    elif v == len(udovl) - 1:
                        tryes.append(el[moment:ends[v]])
                print(tryes)
                for z in range(len(tryes)):
                    if z == 0:
                        print(tryes, tryes[z])
                        while len(tryes[z]) >= 1 and not is_ok(tryes[z]):
                            tryes[z] = tryes[z][:-1]
                        if is_ok(tryes[z]):
                            if eval(tryes[z]) == 0:
                                c += len(tryes[z])
                            m = max(c, m)
                            c = 0
                    else:
                        if eval(tryes[z]) == 0:
                            c += len(tryes[z]) + 1
                            m = max(c-1, m)


print(m)

Ответы (0 шт):