Refactor with itertools

This commit is contained in:
2026-04-11 15:27:41 +02:00
parent 24fb140672
commit 8c3da33225

View File

@@ -9,9 +9,21 @@ Solution for problem 023 of Project Euler
https://projecteuler.net/problem=23 https://projecteuler.net/problem=23
""" """
from itertools import combinations_with_replacement
from project_euler_python.utils import timeit from project_euler_python.utils import timeit
def _get_abundant_numbers(limit):
divisor_sums = [0 for _ in range(limit)]
for divisor in range(1, limit):
for multiple in range(divisor * 2, limit, divisor):
divisor_sums[multiple] += divisor
return [number for number in range(1, limit) if divisor_sums[number] > number]
@timeit("Problem 023") @timeit("Problem 023")
def compute(): def compute():
""" """
@@ -35,25 +47,19 @@ def compute():
sum of two abundant numbers. sum of two abundant numbers.
""" """
limit = 28124 limit = 28123 + 1
divisor_sum = [0] * limit abundant_numbers = _get_abundant_numbers(limit)
for i in range(1, limit):
for j in range(i * 2, limit, i):
divisor_sum[j] += i
abundant_nums = [i for (i, x) in enumerate(divisor_sum) if x > i] expressible_sums = {
first + second
for first, second in combinations_with_replacement(
abundant_numbers,
2,
)
if first + second < limit
}
expressible = [False] * limit return sum(number for number in range(1, limit) if number not in expressible_sums)
for i in abundant_nums:
for j in abundant_nums:
if i + j < limit:
expressible[i + j] = True
else:
break
ans = sum(i for (i, x) in enumerate(expressible) if not x)
return ans
if __name__ == "__main__": if __name__ == "__main__":