From 9aa10ca358e93dd1355b589ab537f890445270d9 Mon Sep 17 00:00:00 2001 From: Kushagra Bansal Date: Wed, 26 Aug 2020 17:01:13 +0530 Subject: [PATCH] Created problem_55 in project_euler (#2354) * Create __init__.py * Add files via upload * Update sol1.py --- project_euler/problem_55/__init__.py | 1 + project_euler/problem_55/sol1.py | 76 ++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 project_euler/problem_55/__init__.py create mode 100644 project_euler/problem_55/sol1.py diff --git a/project_euler/problem_55/__init__.py b/project_euler/problem_55/__init__.py new file mode 100644 index 000000000..792d60054 --- /dev/null +++ b/project_euler/problem_55/__init__.py @@ -0,0 +1 @@ +# diff --git a/project_euler/problem_55/sol1.py b/project_euler/problem_55/sol1.py new file mode 100644 index 000000000..a2e27bbb9 --- /dev/null +++ b/project_euler/problem_55/sol1.py @@ -0,0 +1,76 @@ +""" +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? +""" + + +def is_palindrome(n: int) -> bool: + """ + Returns True if a number is palindrome. + >>> is_palindrome(12567321) + False + >>> is_palindrome(1221) + True + >>> is_palindrome(9876789) + True + """ + return str(n) == str(n)[::-1] + + +def sum_reverse(n: int) -> int: + """ + Returns the sum of n and reverse of n. + >>> sum_reverse(123) + 444 + >>> sum_reverse(3478) + 12221 + >>> sum_reverse(12) + 33 + """ + return int(n) + int(str(n)[::-1]) + + +def compute_lychrel_nums(limit: int) -> int: + """ + Returns the count of all lychrel numbers below limit. + >>> compute_lychrel_nums(10000) + 249 + >>> compute_lychrel_nums(5000) + 76 + >>> compute_lychrel_nums(1000) + 13 + """ + lychrel_nums = [] + for num in range(1, limit): + iterations = 0 + a = num + while iterations < 50: + num = sum_reverse(num) + iterations += 1 + if is_palindrome(num): + break + else: + lychrel_nums.append(a) + return len(lychrel_nums) + + +if __name__ == "__main__": + print(f"{compute_lychrel_nums(10000) = }")