ilginc_durumlar = lambda N: list(filter(lambda k: sum([x for x in range(1, k) if x % 2 == 1]) == sum([x for x in range(k+1, N+1) if x % 2 == 0]), range(1, N+1)))
print(list(filter(lambda n_k: len(n_k[1]) > 0, map(lambda n: (n, ilginc_durumlar(n)), range(1000)))))
Aşağıdaki gibi bir matematiksel ilişki ile de en düşük toplamı bulabiliriz:
n: Uzunluk
i: İndis
i -= (1 if i % 2 else 0)
i’den önceki tüm tek sayıların toplamı: i2 / 4
i’den sonraki tüm çift sayıların toplamı: (n - i) * (i + 2 + n) / 4
if sum(çiftler)==sum(tekler): şeklinde iki ayrı liste ile çalışmak yerine, bulunduğumuz indise göre tekler ve çiftlerin toplamının ne olacağını yukardaki formüllerle hesaplayabiliriz, böylece işlem yükünü azaltmış oluruz.
def min_sum():
n = 1
while True:
for i in range(1, n):
i -= 1 if i % 2 else 0
sum_odd = i ** 2 / 4
sum_even = (n - i) * (i + 2 + n) / 4
if sum_odd == sum_even:
return n, i, sum_odd, sum_even
n += 1
print(min_sum()) # (28, 20, 100.0, 100.0)