""" Project Euler problem 145: https://projecteuler.net/problem=145 Author: Vineet Rao Problem statement: Some positive integers n have the property that the sum [ n + reverse(n) ] consists entirely of odd (decimal) digits. For instance, 36 + 63 = 99 and 409 + 904 = 1313. We will call such numbers reversible; so 36, 63, 409, and 904 are reversible. Leading zeroes are not allowed in either n or reverse(n). There are 120 reversible numbers below one-thousand. How many reversible numbers are there below one-billion (10^9)? """ def odd_digits(num: int) -> bool: """ Check if the number passed as argument has only odd digits. >>> odd_digits(123) False >>> odd_digits(135797531) True """ while num > 0: digit = num % 10 if digit % 2 == 0: return False num //= 10 return True def solution(max_num: int = 1_000_000_000) -> int: """ To evaluate the solution, use solution() >>> solution(1000) 120 >>> solution(1_000_000) 18720 >>> solution(10_000_000) 68720 """ result = 0 # All single digit numbers reverse to themselves, so their sums are even # Therefore at least one digit in their sum is even # Last digit cannot be 0, else it causes leading zeros in reverse for num in range(11, max_num): if num % 10 == 0: continue num_sum = num + int(str(num)[::-1]) num_is_reversible = odd_digits(num_sum) result += 1 if num_is_reversible else 0 return result if __name__ == "__main__": print(f"{solution() = }")