Refactor with itertools
This commit is contained in:
@@ -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__":
|
||||||
|
|||||||
Reference in New Issue
Block a user