https://projecteuler.net/problem=55
If we take 47, reverse and add, 47 + 74 = 121, which is palindromic.
Not all numbers produce palindromes so quickly. For example,
$349 + 943 = 1292$
$1292 + 2921 = 4213$
$4213 + 3124 = 7337$
That is, 349 took three iterations to arrive at a palindrome.
Although no one has proved it yet, it is thought that some numbers, like 196, never produce a palindrome. A number that never forms a palindrome through the reverse and add process is called a Lychrel number. Due to the theoretical nature of these numbers, and for the purpose of this problem, we shall assume that a number is Lychrel until proven otherwise. In addition you are given that for every number below ten-thousand, it will either (i) become a palindrome in less than fifty iterations, or, (ii) no one, with all the computing power that exists, has managed so far to map it to a palindrome. In fact, 10677 is the first number to be shown to require over fifty iterations before producing a palindrome: 4668731596684224866951378664 (53 iterations, 28-digits).
Surprisingly, there are palindromic numbers that are themselves Lychrel numbers; the first example is 4994.
How many Lychrel numbers are there below ten-thousand?
NOTE: Wording was modified slightly on 24 April 2007 to emphasise the theoretical nature of Lychrel numbers.
def get_digits(n):
d = []
while n:
d.append(n % 10)
n //= 10
return d
def is_pilandrome(n):
ds = get_digits(n)
len_ds = len(ds)
if len_ds < 2:
return True
for i in range(0, len_ds // 2):
if ds[i] != ds[len_ds - i - 1]:
return False
return True
assert(is_pilandrome(1337) == False)
assert(is_pilandrome(1331))
assert(is_pilandrome(131))
assert(is_pilandrome(132) == False)
def get_digit_inverse(n):
ds = get_digits(n)
base = 1
i = 0
for d in ds[::-1]:
i += (base * d)
base *= 10
return i
assert(get_digit_inverse(47) == 74)
assert(get_digit_inverse(47) == 74)
def is_not_lychrel(n, iterations=50):
for i in range(0, iterations):
n = n + get_digit_inverse(n)
if is_pilandrome(n):
return (i + 1)
return 0
assert(is_not_lychrel(47) == 1)
assert(is_not_lychrel(349) == 3)
assert(is_not_lychrel(10677, 100) == 53)
lychrels = [n for n in range(1, 10000) if is_not_lychrel(n) == 0]
s = len(lychrels)
print(s)