2020-10-09 17:11:00 +00:00
|
|
|
"""
|
|
|
|
Problem 125: https://projecteuler.net/problem=125
|
|
|
|
|
|
|
|
The palindromic number 595 is interesting because it can be written as the sum
|
|
|
|
of consecutive squares: 6^2 + 7^2 + 8^2 + 9^2 + 10^2 + 11^2 + 12^2.
|
|
|
|
|
|
|
|
There are exactly eleven palindromes below one-thousand that can be written as
|
|
|
|
consecutive square sums, and the sum of these palindromes is 4164. Note that
|
|
|
|
1 = 0^2 + 1^2 has not been included as this problem is concerned with the
|
|
|
|
squares of positive integers.
|
|
|
|
|
|
|
|
Find the sum of all the numbers less than 10^8 that are both palindromic and can
|
|
|
|
be written as the sum of consecutive squares.
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
def is_palindrome(n: int) -> bool:
|
|
|
|
"""
|
|
|
|
Check if an integer is palindromic.
|
|
|
|
>>> is_palindrome(12521)
|
|
|
|
True
|
|
|
|
>>> is_palindrome(12522)
|
|
|
|
False
|
|
|
|
>>> is_palindrome(12210)
|
|
|
|
False
|
|
|
|
"""
|
|
|
|
if n % 10 == 0:
|
|
|
|
return False
|
|
|
|
s = str(n)
|
|
|
|
return s == s[::-1]
|
|
|
|
|
|
|
|
|
|
|
|
def solution() -> int:
|
|
|
|
"""
|
|
|
|
Returns the sum of all numbers less than 1e8 that are both palindromic and
|
|
|
|
can be written as the sum of consecutive squares.
|
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
LIMIT = 10**8 # noqa: N806
|
2020-10-09 17:11:00 +00:00
|
|
|
answer = set()
|
|
|
|
first_square = 1
|
|
|
|
sum_squares = 5
|
|
|
|
while sum_squares < LIMIT:
|
|
|
|
last_square = first_square + 1
|
|
|
|
while sum_squares < LIMIT:
|
|
|
|
if is_palindrome(sum_squares):
|
|
|
|
answer.add(sum_squares)
|
|
|
|
last_square += 1
|
2022-01-30 19:29:54 +00:00
|
|
|
sum_squares += last_square**2
|
2020-10-09 17:11:00 +00:00
|
|
|
first_square += 1
|
2022-01-30 19:29:54 +00:00
|
|
|
sum_squares = first_square**2 + (first_square + 1) ** 2
|
2020-10-09 17:11:00 +00:00
|
|
|
|
|
|
|
return sum(answer)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
print(solution())
|