Python

Решите, пожалуйста, задачу на Python

***ba9Man*** ~~~~~~
***ba9Man*** ~~~~~~
84
Нормально решается на итераторах:
 from itertools import chain, pairwise

def getmess(b): return b >> 16
def getrand(b): return (b >> 8) & 255
def gethash(b): return b & 255
def hash(b, hp): return (37 * (getmess(b) + getrand(b) + hp)) & 255
def valid(b, hp): return gethash(b) == hash(b, hp)

n = int(input())
bs = chain([0], (int(input()) for _ in range(n)))
cs = (i for (i, (bp, b)) in enumerate(pairwise(bs))
if gethash(b) >= 100 or not valid(b, gethash(bp)))
print(next(cs, -1))

На приведённых тестовых данных работает.
Ввод:
 5
6122802
14406496
15230209
2541121
1758741
Вывод:
 -1 
Ввод:
 5
1865535
13479687
16689153
1839958
5214020
Вывод:
 3 

Алгоритм однопроходный, линейной сложности, как и положено на итераторах.

К последовательности входных блоков спереди цепляем 0, чтобы был предыдущий хеш для вычисления первого блока.
На базе получившегося итератора функцией pairwise формируем новый итератор из соседних пар (bᵢ, bᵢ₁) для i ∈ [0, n - 1], причём, b₀ = 0, и снабжаем пары возрастающим индексом i (который нам даёт функция enumerate). В каждой паре вычисляем хеш блока и сравниваем его с хешем, хранящимся внутри блока.
В результирующем итераторе оставляем только номера (i) и только тех блоков, у которых хеши не совпадают с расчётными или выходят за пределы диапазона допустимых значений хеша.
В конце выводим номер первого блока из этого итератора, а если номеров не нашлось, то -1.
Вся арифметика вынесена в отдельные функции, чтобы не мельтешить в итераторах.
Алексей Иванов
Алексей Иванов
87 571
Лучший ответ