Решение почти рабочее, содержит ошибку, и вправду похоже на Франкенштейна. Давай-ка его разберём:
Начнем с ошибки:
припишем справа к той длинной строке вот такую:
'0999999999999'
(ноль и 12 девяток). Очевидно, этот хвост даст произведением ноль. Но твой алгоритм слажает, и в результате выдаст Finisg_Number равным 282429536481. Исправим это:
All_Numbers = list('7316717...2963450' + '0999999999999')
Finisg_Number = 0
for _ in range(len(All_Numbers) - 13):
temp = 1
for Number in All_Numbers[: 13]:
temp *= int(Number)
del All_Numbers[0]
if temp > Finisg_Number:
Finisg_Number = temp
print(Finisg_Number)
Далее пройдёмся по эффективности: хотя задача мелкая и выполняется быстро, почему бы не разобраться, что тормозит?
del All_Numbers[0]
- это тяжелая операция, при удалении первого элемента листа все остальные копируются на одну позицию левее. А вот
del All_Numbers[-1]
такого эффекта не вызывает. Попробуем переписать так:
All_Numbers = list('7316717...2963450')
Finisg_Number = 0
for _ in range(len(All_Numbers) - 13):
temp = 1
for Number in All_Numbers[-13:]:
temp *= int(Number)
del All_Numbers[-1]
if temp > Finisg_Number:
Finisg_Number = temp
print(Finisg_Number)
Вроде работает. Ну и еще, на каждом шагу выполняется 13 умножений. Немного, а если бы 313? Есть способ обойти и это. Тут я выложу свой код с минимумом комментариев:
l = list(map(int,
'73167176531330624919225119674426574742355349194934969835203'
'12774506326239578318016984801869478851843858615607891129494'
'95459501737958331952853208805511125406987471585238630507156'
'93290963295227443043557668966489504452445231617318564030987'
'11121722383113622298934233803081353362766142828064444866452'
'38749303589072962904915604407723907138105158593079608667017'
'24271218839987979087922749219016997208880937766572733300105'
'33678812202354218097512545405947522435258490771167055601360'
'48395864467063244157221553975369781797784617406495514929086'
'25693219784686224828397224137565705605749026140797296865241'
'45351004748216637048440319989000889524345065854122758866688'
'11642717147992444292823086346567481391912316282458617866458'
'35912456652947654568284891288314260769004224219022671055626'
'32111110937054421750694165896040807198403850962455444362981'
'23098787992724428490918884580156166097919133875499200524063'
'68991256071760605886116467109405077541002256983155200055935'
'72972571636269561882670428252483600823257530420752963450'
'0999999999999'))
sliding = 1 # в sliding я буду держать произведение тех чисел из окна, которые больше нуля
for a in l[:13]: # это начальное окно, в цикле я буду сдвигать его вправо
if a:
sliding *= a
zerocount = l[:13].count(0) # тут я буду отслеживать, сколько нулей в текущем окне
best = 0 if zerocount else sliding # упс, чуть не потерял начальное окно
for a, b in zip(l, l[13:]): # a выходит из окна, b заходит
if a:
sliding //= a
else:
zerocount -= 1
if b:
sliding *= b
else:
zerocount += 1
if not zerocount and best < sliding:
best = sliding
print(best)
ps Поработай над стилем, ссылку на pep8 давали выше.