Как улучшить код на Python(олимпиадная задачка)?

Есть код к олимпиадной задаче, который подходит под 5 из 9 условий. Код и условия ниже.введите сюда описание изображения

n = int(input()) 
a = [int(i) for i in input().split()] 
k = 0 
x = [] 
for i in range(1, n+1): 
    if i!=n: 
        if sum(a[:i])%i==0 and sum(a[i:])%(n-i)==0: 
            l = [str(sum(a[:i])/i)]*i + [str(sum(a[i:])/(n-i))]*(n-i) 
            if l not in x: 
                k+=1 
                x.append(l) 
if sum(a)%n==0: 
    if [str(sum(a)/n)]*n not in x: 
        k+=1 
print(k)

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

Автор решения: vp_arth

Основные моменты:

  • set для хранения найденных решений даёт уникальность из коробки, теперь не нужно проверять not in x
  • divmod вместо двух делений, суммы теперь тоже считаются однажды
  • крайний случай(всего один участок) объединил с остальным решением if i else (0, 0)
def solve(a, n):
    variants = set();
    for i in range(n):
        left, right = a[:i], a[i:]

        l_avg, l_rem = divmod(sum(left), i) if i else (0, 0)
        r_avg, r_rem = divmod(sum(right), n - i)

        if l_rem == r_rem == 0:
            variants.add(','.join([str(l_avg)] * i + [str(r_avg)] * (n-i)))

    return len(variants)

Можно добавить микрооптимизаций, вроде бегущих сумм, но непонятно по каким критериям нужно «улучшать» этот код:

def solve(a, n):
    variants = set();
    l_sum, r_sum = 0, sum(a)
    for i in range(n):
        l_avg, l_rem = divmod(l_sum, i) if i else (0, 0)
        r_avg, r_rem = divmod(r_sum, n - i)


        if l_rem == r_rem == 0:
            # variants.add(','.join([str(l_avg)] * i + [str(r_avg)] * (n-i)))
            variants.add(f'{i}, {l_avg}, {r_avg}' if i and l_avg != r_avg else r_avg)


        l_sum += a[i]
        r_sum -= a[i]

    return len(variants)
a = [10, 4, 2, 7, 5, 8, 6, 6, 15] 
assert solve(a, len(a)) == 3
a = [3, 5, 2, 7, 6, 4, 5, 8, 1, 7] 
assert solve(a, len(a)) == 3
→ Ссылка