From 74a915c1cbbb3a9fd1726b69f7e7f9539eca29db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Henrik=20=C3=85keson?= Date: Sat, 9 Oct 2021 17:46:55 +0200 Subject: [PATCH 1/8] Added solution for Project Euler problem 145 --- project_euler/problem_145/__init__.py | 0 project_euler/problem_145/sol1.py | 89 +++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 project_euler/problem_145/__init__.py create mode 100644 project_euler/problem_145/sol1.py diff --git a/project_euler/problem_145/__init__.py b/project_euler/problem_145/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/project_euler/problem_145/sol1.py b/project_euler/problem_145/sol1.py new file mode 100644 index 000000000000..99e545511fe4 --- /dev/null +++ b/project_euler/problem_145/sol1.py @@ -0,0 +1,89 @@ +""" +Problem 145: https://projecteuler.net/problem=145 + +Name: How many reversible numbers are there below one-billion? + +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)? + + +Solution: + +Here a brute force solution is used to find and count the reversible numbers. + +""" +from __future__ import annotations + + +def check_if_odd(sum: int) -> int: + """ + Check if the last digit in the sum is even or odd. If even return 0. + If odd then floor devision by 10 is used to remove the last number. + Process continues until sum becomes 0 because no more numbers. + >>> check_if_odd(36) + 0 + >>> check_if_odd(33) + 1 + """ + while sum > 0: + if (sum % 10) % 2 == 0: + return 0 + sum = sum // 10 + return 1 + + +def find_reverse_nr(nr: int) -> int: + """ + Reverses the given number. Does not work with number that end in zero. + >>> find_reverse_nr(36) + 63 + >>> find_reverse_nr(409) + 904 + """ + reverse = 0 + + while nr > 0: + temp = nr % 10 + reverse = reverse * 10 + temp + nr = nr // 10 + + return reverse + + +def solution(nr: int) -> int: + """ + Loops over the range of numbers. + Checks if they have ending zeros which disqualifies them from being reversable. + If that condition is passed it generates the reveresed number. + Then sum up n and reverse(n). + Then check if all the numbers in the sum are odd. If true add to the answer. + >>> solution(1000000000) + 608720 + >>> solution(1000000) + 18720 + >>> solution(1000000) + 18720 + >>> solution(1000) + 120 + """ + answer = 0 + for x in range(1, nr): + if x % 10 != 0: + reversed_nr = find_reverse_nr(x) + sum = x + reversed_nr + answer += check_if_odd(sum) + + return answer + + +nr = 1000000000 + +if __name__ == "__main__": + print(f"{solution(nr) = }") From a41c77d9775bffd4d4a19538519346f96513ffdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Henrik=20=C3=85keson?= <80765479+chakeson@users.noreply.github.com> Date: Wed, 20 Oct 2021 00:21:38 +0200 Subject: [PATCH 2/8] Updated spelling of comments Updated spelling inline with codespell --- project_euler/problem_145/sol1.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project_euler/problem_145/sol1.py b/project_euler/problem_145/sol1.py index 99e545511fe4..4a033035cc98 100644 --- a/project_euler/problem_145/sol1.py +++ b/project_euler/problem_145/sol1.py @@ -25,7 +25,7 @@ def check_if_odd(sum: int) -> int: """ Check if the last digit in the sum is even or odd. If even return 0. - If odd then floor devision by 10 is used to remove the last number. + If odd then floor division by 10 is used to remove the last number. Process continues until sum becomes 0 because no more numbers. >>> check_if_odd(36) 0 @@ -60,8 +60,8 @@ def find_reverse_nr(nr: int) -> int: def solution(nr: int) -> int: """ Loops over the range of numbers. - Checks if they have ending zeros which disqualifies them from being reversable. - If that condition is passed it generates the reveresed number. + Checks if they have ending zeros which disqualifies them from being reversible. + If that condition is passed it generates the reversed number. Then sum up n and reverse(n). Then check if all the numbers in the sum are odd. If true add to the answer. >>> solution(1000000000) From c13c406ee21c46adb4c4603d4ed4f6a5e4f93b53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Henrik=20=C3=85keson?= <80765479+chakeson@users.noreply.github.com> Date: Wed, 20 Oct 2021 00:25:30 +0200 Subject: [PATCH 3/8] Removed trailing whitespaces in comments --- project_euler/problem_145/sol1.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/project_euler/problem_145/sol1.py b/project_euler/problem_145/sol1.py index 4a033035cc98..86e88dc2a662 100644 --- a/project_euler/problem_145/sol1.py +++ b/project_euler/problem_145/sol1.py @@ -3,10 +3,10 @@ Name: How many reversible numbers are there below one-billion? -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. +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. From 77a7f4c28540d75889bc42454bc39834d3760953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Henrik=20=C3=85keson?= <80765479+chakeson@users.noreply.github.com> Date: Wed, 20 Oct 2021 15:21:00 +0200 Subject: [PATCH 4/8] Added default values. --- project_euler/problem_145/sol1.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project_euler/problem_145/sol1.py b/project_euler/problem_145/sol1.py index 86e88dc2a662..27f14d8c2115 100644 --- a/project_euler/problem_145/sol1.py +++ b/project_euler/problem_145/sol1.py @@ -22,7 +22,7 @@ from __future__ import annotations -def check_if_odd(sum: int) -> int: +def check_if_odd(sum: int = 36) -> int: """ Check if the last digit in the sum is even or odd. If even return 0. If odd then floor division by 10 is used to remove the last number. @@ -39,7 +39,7 @@ def check_if_odd(sum: int) -> int: return 1 -def find_reverse_nr(nr: int) -> int: +def find_reverse_nr(nr: int = 36) -> int: """ Reverses the given number. Does not work with number that end in zero. >>> find_reverse_nr(36) @@ -57,7 +57,7 @@ def find_reverse_nr(nr: int) -> int: return reverse -def solution(nr: int) -> int: +def solution(nr: int = 1000000000) -> int: """ Loops over the range of numbers. Checks if they have ending zeros which disqualifies them from being reversible. From 8c211392259718b6a5a41e8207100621f733176c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Henrik=20=C3=85keson?= <80765479+chakeson@users.noreply.github.com> Date: Tue, 26 Oct 2021 15:22:46 +0200 Subject: [PATCH 5/8] nr -> number Co-authored-by: John Law --- project_euler/problem_145/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_145/sol1.py b/project_euler/problem_145/sol1.py index 27f14d8c2115..af0bd728f0ba 100644 --- a/project_euler/problem_145/sol1.py +++ b/project_euler/problem_145/sol1.py @@ -57,7 +57,7 @@ def find_reverse_nr(nr: int = 36) -> int: return reverse -def solution(nr: int = 1000000000) -> int: +def solution(number: int = 1000000000) -> int: """ Loops over the range of numbers. Checks if they have ending zeros which disqualifies them from being reversible. From d407d55bbaeac3effdc523e59c0b81355a65587a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Henrik=20=C3=85keson?= <80765479+chakeson@users.noreply.github.com> Date: Tue, 26 Oct 2021 15:24:36 +0200 Subject: [PATCH 6/8] nr -> number --- project_euler/problem_145/sol1.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/project_euler/problem_145/sol1.py b/project_euler/problem_145/sol1.py index af0bd728f0ba..44a7b4bed385 100644 --- a/project_euler/problem_145/sol1.py +++ b/project_euler/problem_145/sol1.py @@ -39,7 +39,7 @@ def check_if_odd(sum: int = 36) -> int: return 1 -def find_reverse_nr(nr: int = 36) -> int: +def find_reverse_nr(number: int = 36) -> int: """ Reverses the given number. Does not work with number that end in zero. >>> find_reverse_nr(36) @@ -49,10 +49,10 @@ def find_reverse_nr(nr: int = 36) -> int: """ reverse = 0 - while nr > 0: - temp = nr % 10 + while number > 0: + temp = number % 10 reverse = reverse * 10 + temp - nr = nr // 10 + number = number // 10 return reverse @@ -74,7 +74,7 @@ def solution(number: int = 1000000000) -> int: 120 """ answer = 0 - for x in range(1, nr): + for x in range(1, number): if x % 10 != 0: reversed_nr = find_reverse_nr(x) sum = x + reversed_nr From 59f7001119540822d969a52519238cd6d86ef09c Mon Sep 17 00:00:00 2001 From: John Law Date: Sun, 7 Nov 2021 23:05:37 +0800 Subject: [PATCH 7/8] Update sol1.py --- project_euler/problem_145/sol1.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/project_euler/problem_145/sol1.py b/project_euler/problem_145/sol1.py index 44a7b4bed385..2e0e12f880a1 100644 --- a/project_euler/problem_145/sol1.py +++ b/project_euler/problem_145/sol1.py @@ -83,7 +83,5 @@ def solution(number: int = 1000000000) -> int: return answer -nr = 1000000000 - if __name__ == "__main__": - print(f"{solution(nr) = }") + print(f"{solution() = }") From 46474a7880fad25bae4d4be3fa34af3b17522114 Mon Sep 17 00:00:00 2001 From: John Law Date: Wed, 10 Nov 2021 18:15:34 +0800 Subject: [PATCH 8/8] Update sol1.py --- project_euler/problem_145/sol1.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/project_euler/problem_145/sol1.py b/project_euler/problem_145/sol1.py index 2e0e12f880a1..5ba3af86a6a1 100644 --- a/project_euler/problem_145/sol1.py +++ b/project_euler/problem_145/sol1.py @@ -39,12 +39,12 @@ def check_if_odd(sum: int = 36) -> int: return 1 -def find_reverse_nr(number: int = 36) -> int: +def find_reverse_number(number: int = 36) -> int: """ Reverses the given number. Does not work with number that end in zero. - >>> find_reverse_nr(36) + >>> find_reverse_number(36) 63 - >>> find_reverse_nr(409) + >>> find_reverse_number(409) 904 """ reverse = 0 @@ -76,8 +76,8 @@ def solution(number: int = 1000000000) -> int: answer = 0 for x in range(1, number): if x % 10 != 0: - reversed_nr = find_reverse_nr(x) - sum = x + reversed_nr + reversed_number = find_reverse_number(x) + sum = x + reversed_number answer += check_if_odd(sum) return answer