Ошибка "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)
