From e70c27d434d22413a5a43d4830f30592d7564dd2 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Mon, 5 Oct 2020 18:51:26 -0700 Subject: [PATCH 01/16] Fix typehints in project_euler/problem01 Squashed commit of the following: commit 6801d073b31bf702814861cd3b07b634ca295bfa Author: Archaengel Date: Mon Oct 5 16:40:10 2020 -0700 Fix typehints in project_euler/problem01 commit 29afc3af114abd1b99dc3f7c8fc99128229db131 Author: Archaengel Date: Mon Oct 5 15:06:34 2020 -0700 Add typehints and default argument for project_euler/problem_01 --- project_euler/problem_01/sol1.py | 2 +- project_euler/problem_01/sol2.py | 2 +- project_euler/problem_01/sol3.py | 2 +- project_euler/problem_01/sol4.py | 2 +- project_euler/problem_01/sol5.py | 2 +- project_euler/problem_01/sol6.py | 2 +- project_euler/problem_01/sol7.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/project_euler/problem_01/sol1.py b/project_euler/problem_01/sol1.py index e81156edaee4..2dbb60cdb16f 100644 --- a/project_euler/problem_01/sol1.py +++ b/project_euler/problem_01/sol1.py @@ -6,7 +6,7 @@ """ -def solution(n): +def solution(n: int = 1000) -> int: """Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) diff --git a/project_euler/problem_01/sol2.py b/project_euler/problem_01/sol2.py index 8041c7ffa589..212fd40562d1 100644 --- a/project_euler/problem_01/sol2.py +++ b/project_euler/problem_01/sol2.py @@ -6,7 +6,7 @@ """ -def solution(n): +def solution(n: int = 1000) -> int: """Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) diff --git a/project_euler/problem_01/sol3.py b/project_euler/problem_01/sol3.py index c0bcbc06ec83..faa505615924 100644 --- a/project_euler/problem_01/sol3.py +++ b/project_euler/problem_01/sol3.py @@ -6,7 +6,7 @@ """ -def solution(n): +def solution(n: int = 1000) -> int: """ This solution is based on the pattern that the successive numbers in the series follow: 0+3,+2,+1,+3,+1,+2,+3. diff --git a/project_euler/problem_01/sol4.py b/project_euler/problem_01/sol4.py index e01dc977d8cf..d5e86320da5e 100644 --- a/project_euler/problem_01/sol4.py +++ b/project_euler/problem_01/sol4.py @@ -6,7 +6,7 @@ """ -def solution(n): +def solution(n: int = 1000) -> int: """Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) diff --git a/project_euler/problem_01/sol5.py b/project_euler/problem_01/sol5.py index bd96d965f92d..eae62ef5c75c 100644 --- a/project_euler/problem_01/sol5.py +++ b/project_euler/problem_01/sol5.py @@ -8,7 +8,7 @@ """A straightforward pythonic solution using list comprehension""" -def solution(n): +def solution(n: int = 1000) -> int: """Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) diff --git a/project_euler/problem_01/sol6.py b/project_euler/problem_01/sol6.py index c9f94b9f77c8..ca08a4a639ab 100644 --- a/project_euler/problem_01/sol6.py +++ b/project_euler/problem_01/sol6.py @@ -6,7 +6,7 @@ """ -def solution(n): +def solution(n: int = 1000) -> int: """Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) diff --git a/project_euler/problem_01/sol7.py b/project_euler/problem_01/sol7.py index a0510b54c409..8e53d2a81fb9 100644 --- a/project_euler/problem_01/sol7.py +++ b/project_euler/problem_01/sol7.py @@ -6,7 +6,7 @@ """ -def solution(n): +def solution(n: int = 1000) -> int: """Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) From db03f25bbd63636826379928f9d5f95ba7ea4c51 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Mon, 5 Oct 2020 20:38:39 -0700 Subject: [PATCH 02/16] Add default args, typehints, and expand variable names for PE prob 02 --- project_euler/problem_02/sol1.py | 8 ++++---- project_euler/problem_02/sol2.py | 18 +++++++++--------- project_euler/problem_02/sol3.py | 2 +- project_euler/problem_02/sol4.py | 6 +++--- project_euler/problem_02/sol5.py | 20 ++++++++++---------- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/project_euler/problem_02/sol1.py b/project_euler/problem_02/sol1.py index ec89ddaeb2b5..2acc93b0affc 100644 --- a/project_euler/problem_02/sol1.py +++ b/project_euler/problem_02/sol1.py @@ -11,7 +11,7 @@ """ -def solution(n): +def solution(n: int = 4000000) -> int: """Returns the sum of all fibonacci sequence even elements that are lower or equals to n. @@ -28,13 +28,13 @@ def solution(n): """ i = 1 j = 2 - sum = 0 + total = 0 while j <= n: if j % 2 == 0: - sum += j + total += j i, j = j, i + j - return sum + return total if __name__ == "__main__": diff --git a/project_euler/problem_02/sol2.py b/project_euler/problem_02/sol2.py index bc5040cc6b3b..01fc552b9b21 100644 --- a/project_euler/problem_02/sol2.py +++ b/project_euler/problem_02/sol2.py @@ -11,28 +11,28 @@ """ -def solution(n): +def solution(n: int = 4000000) -> int: """Returns the sum of all fibonacci sequence even elements that are lower or equals to n. >>> solution(10) - [2, 8] + 10 >>> solution(15) - [2, 8] + 10 >>> solution(2) - [2] + 2 >>> solution(1) - [] + 0 >>> solution(34) - [2, 8, 34] + 44 """ - ls = [] + even_fibs = [] a, b = 0, 1 while b <= n: if b % 2 == 0: - ls.append(b) + even_fibs.append(b) a, b = b, a + b - return ls + return sum(even_fibs) if __name__ == "__main__": diff --git a/project_euler/problem_02/sol3.py b/project_euler/problem_02/sol3.py index f29f21c287e5..53d8ca6f1b68 100644 --- a/project_euler/problem_02/sol3.py +++ b/project_euler/problem_02/sol3.py @@ -11,7 +11,7 @@ """ -def solution(n): +def solution(n: int = 4000000) -> int: """Returns the sum of all fibonacci sequence even elements that are lower or equals to n. diff --git a/project_euler/problem_02/sol4.py b/project_euler/problem_02/sol4.py index be4328941aa3..a87410b7006d 100644 --- a/project_euler/problem_02/sol4.py +++ b/project_euler/problem_02/sol4.py @@ -13,7 +13,7 @@ from decimal import Decimal, getcontext -def solution(n): +def solution(n: int = 4000000) -> int: """Returns the sum of all fibonacci sequence even elements that are lower or equals to n. @@ -57,8 +57,8 @@ def solution(n): index = (math.floor(math.log(n * (phi + 2), phi) - 1) // 3) * 3 + 2 num = Decimal(round(phi ** Decimal(index + 1))) / (phi + 2) - sum = num // 2 - return int(sum) + total = num // 2 + return int(total) if __name__ == "__main__": diff --git a/project_euler/problem_02/sol5.py b/project_euler/problem_02/sol5.py index 180906cf8717..dcf6eae85891 100644 --- a/project_euler/problem_02/sol5.py +++ b/project_euler/problem_02/sol5.py @@ -11,7 +11,7 @@ """ -def solution(n): +def solution(n: int = 4000000) -> int: """Returns the sum of all fibonacci sequence even elements that are lower or equals to n. @@ -27,19 +27,19 @@ def solution(n): 44 """ - a = [0, 1] + fib = [0, 1] i = 0 - while a[i] <= n: - a.append(a[i] + a[i + 1]) - if a[i + 2] > n: + while fib[i] <= n: + fib.append(fib[i] + fib[i + 1]) + if fib[i + 2] > n: break i += 1 - sum = 0 - for j in range(len(a) - 1): - if a[j] % 2 == 0: - sum += a[j] + total = 0 + for j in range(len(fib) - 1): + if fib[j] % 2 == 0: + total += fib[j] - return sum + return total if __name__ == "__main__": From 4c163d0e2d065b6df35773551eb9cb3d598762b2 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 01:58:35 -0700 Subject: [PATCH 03/16] Add style improvements for first solution of PE Problem 02 --- project_euler/problem_03/sol1.py | 72 ++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/project_euler/problem_03/sol1.py b/project_euler/problem_03/sol1.py index 347f8a53f5b4..8d14bf1a425c 100644 --- a/project_euler/problem_03/sol1.py +++ b/project_euler/problem_03/sol1.py @@ -5,22 +5,45 @@ e.g. for 10, largest prime factor = 5. For 17, largest prime factor = 17. """ + import math -def isprime(no): - if no == 2: +def isprime(num: int) -> bool: + """Returns boolean representing primality of given number num. + >>> isprime(2) + True + >>> isprime(3) + True + >>> isprime(27) + False + >>> isprime(2999) + True + >>> isprime(0) + Traceback (most recent call last): + ... + ValueError: Parameter num must be greater or equal to two. + >>> isprime(1) + Traceback (most recent call last): + ... + ValueError: Parameter num must be greater or equal to two. + """ + if num <= 1: + raise ValueError("Parameter num must be greater or equal to two.") + + if num == 2: return True - elif no % 2 == 0: + elif num % 2 == 0: return False - sq = int(math.sqrt(no)) + 1 - for i in range(3, sq, 2): - if no % i == 0: + + for i in range(3, int(math.sqrt(num)) + 1, 2): + if num % i == 0: return False + return True -def solution(n): +def solution(n: int = 600851475143) -> int: """Returns the largest prime factor of a given number n. >>> solution(13195) @@ -54,24 +77,27 @@ def solution(n): raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") - maxNumber = 0 + + max_number = 0 + + if isprime(n): + return n + + while n % 2 == 0: + n //= 2 + if isprime(n): return n - else: - while n % 2 == 0: - n = n / 2 - if isprime(n): - return int(n) - else: - n1 = int(math.sqrt(n)) + 1 - for i in range(3, n1, 2): - if n % i == 0: - if isprime(n / i): - maxNumber = n / i - break - elif isprime(i): - maxNumber = i - return maxNumber + + for i in range(3, int(math.sqrt(n)) + 1, 2): + if n % i == 0: + if isprime(n / i): + max_number = n / i + break + elif isprime(i): + max_number = i + + return max_number if __name__ == "__main__": From 8c30a0cdfc5c7497595c71270409da6c19b9792b Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 02:01:53 -0700 Subject: [PATCH 04/16] Add default arg and typehints for second solution of PE Problem 02 --- project_euler/problem_03/sol2.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_03/sol2.py b/project_euler/problem_03/sol2.py index daac041d4bd9..a8904573cedd 100644 --- a/project_euler/problem_03/sol2.py +++ b/project_euler/problem_03/sol2.py @@ -7,7 +7,7 @@ """ -def solution(n): +def solution(n: int = 600851475143) -> int: """Returns the largest prime factor of a given number n. >>> solution(13195) @@ -41,15 +41,19 @@ def solution(n): raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") + prime = 1 i = 2 + while i * i <= n: while n % i == 0: prime = i n //= i i += 1 + if n > 1: prime = n + return int(prime) From a277101e5536423352298b45fd6820febb1bf559 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 02:06:22 -0700 Subject: [PATCH 05/16] Add default arg for third solution of PE Problem 02 --- project_euler/problem_03/sol3.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/project_euler/problem_03/sol3.py b/project_euler/problem_03/sol3.py index 5fe45df59984..706ec9b2af06 100644 --- a/project_euler/problem_03/sol3.py +++ b/project_euler/problem_03/sol3.py @@ -7,7 +7,7 @@ """ -def solution(n: int) -> int: +def solution(n: int = 600851475143) -> int: """Returns the largest prime factor of a given number n. >>> solution(13195) @@ -41,23 +41,26 @@ def solution(n: int) -> int: raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") + i = 2 ans = 0 + if n == 2: return 2 + while n > 2: while n % i != 0: i += 1 + ans = i + while n % i == 0: n = n / i + i += 1 return int(ans) if __name__ == "__main__": - # print(solution(int(input().strip()))) - import doctest - - doctest.testmod() + print(solution(int(input().strip()))) From f69193814e27945167a62d929498d8e2011af216 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 01:58:35 -0700 Subject: [PATCH 06/16] Add style improvements for 1st soln of PE problem 03 --- project_euler/problem_03/sol1.py | 72 ++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/project_euler/problem_03/sol1.py b/project_euler/problem_03/sol1.py index 347f8a53f5b4..8d14bf1a425c 100644 --- a/project_euler/problem_03/sol1.py +++ b/project_euler/problem_03/sol1.py @@ -5,22 +5,45 @@ e.g. for 10, largest prime factor = 5. For 17, largest prime factor = 17. """ + import math -def isprime(no): - if no == 2: +def isprime(num: int) -> bool: + """Returns boolean representing primality of given number num. + >>> isprime(2) + True + >>> isprime(3) + True + >>> isprime(27) + False + >>> isprime(2999) + True + >>> isprime(0) + Traceback (most recent call last): + ... + ValueError: Parameter num must be greater or equal to two. + >>> isprime(1) + Traceback (most recent call last): + ... + ValueError: Parameter num must be greater or equal to two. + """ + if num <= 1: + raise ValueError("Parameter num must be greater or equal to two.") + + if num == 2: return True - elif no % 2 == 0: + elif num % 2 == 0: return False - sq = int(math.sqrt(no)) + 1 - for i in range(3, sq, 2): - if no % i == 0: + + for i in range(3, int(math.sqrt(num)) + 1, 2): + if num % i == 0: return False + return True -def solution(n): +def solution(n: int = 600851475143) -> int: """Returns the largest prime factor of a given number n. >>> solution(13195) @@ -54,24 +77,27 @@ def solution(n): raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") - maxNumber = 0 + + max_number = 0 + + if isprime(n): + return n + + while n % 2 == 0: + n //= 2 + if isprime(n): return n - else: - while n % 2 == 0: - n = n / 2 - if isprime(n): - return int(n) - else: - n1 = int(math.sqrt(n)) + 1 - for i in range(3, n1, 2): - if n % i == 0: - if isprime(n / i): - maxNumber = n / i - break - elif isprime(i): - maxNumber = i - return maxNumber + + for i in range(3, int(math.sqrt(n)) + 1, 2): + if n % i == 0: + if isprime(n / i): + max_number = n / i + break + elif isprime(i): + max_number = i + + return max_number if __name__ == "__main__": From f188b91a8dd799dc716369590aa3f68eae402486 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 02:01:53 -0700 Subject: [PATCH 07/16] Add default arg and typehints for 2nd soln of PE problem 03 --- project_euler/problem_03/sol2.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_03/sol2.py b/project_euler/problem_03/sol2.py index daac041d4bd9..a8904573cedd 100644 --- a/project_euler/problem_03/sol2.py +++ b/project_euler/problem_03/sol2.py @@ -7,7 +7,7 @@ """ -def solution(n): +def solution(n: int = 600851475143) -> int: """Returns the largest prime factor of a given number n. >>> solution(13195) @@ -41,15 +41,19 @@ def solution(n): raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") + prime = 1 i = 2 + while i * i <= n: while n % i == 0: prime = i n //= i i += 1 + if n > 1: prime = n + return int(prime) From 8053b0dcb990c43dfd04440788ee753d508464df Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 02:06:22 -0700 Subject: [PATCH 08/16] Add default arg for 3rd soln of PE problem 03 --- project_euler/problem_03/sol3.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/project_euler/problem_03/sol3.py b/project_euler/problem_03/sol3.py index 5fe45df59984..706ec9b2af06 100644 --- a/project_euler/problem_03/sol3.py +++ b/project_euler/problem_03/sol3.py @@ -7,7 +7,7 @@ """ -def solution(n: int) -> int: +def solution(n: int = 600851475143) -> int: """Returns the largest prime factor of a given number n. >>> solution(13195) @@ -41,23 +41,26 @@ def solution(n: int) -> int: raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") + i = 2 ans = 0 + if n == 2: return 2 + while n > 2: while n % i != 0: i += 1 + ans = i + while n % i == 0: n = n / i + i += 1 return int(ans) if __name__ == "__main__": - # print(solution(int(input().strip()))) - import doctest - - doctest.testmod() + print(solution(int(input().strip()))) From e4f8b0dd8c08e02d22bbb9b645dfa0f1a7d4af9e Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 06:41:30 -0700 Subject: [PATCH 09/16] Remove unnecessary newlines --- project_euler/problem_03/sol1.py | 11 ----------- project_euler/problem_03/sol2.py | 5 ----- project_euler/problem_03/sol3.py | 8 -------- 3 files changed, 24 deletions(-) diff --git a/project_euler/problem_03/sol1.py b/project_euler/problem_03/sol1.py index 8d14bf1a425c..b2a4e0604c2c 100644 --- a/project_euler/problem_03/sol1.py +++ b/project_euler/problem_03/sol1.py @@ -5,7 +5,6 @@ e.g. for 10, largest prime factor = 5. For 17, largest prime factor = 17. """ - import math @@ -30,22 +29,18 @@ def isprime(num: int) -> bool: """ if num <= 1: raise ValueError("Parameter num must be greater or equal to two.") - if num == 2: return True elif num % 2 == 0: return False - for i in range(3, int(math.sqrt(num)) + 1, 2): if num % i == 0: return False - return True def solution(n: int = 600851475143) -> int: """Returns the largest prime factor of a given number n. - >>> solution(13195) 29 >>> solution(10) @@ -77,18 +72,13 @@ def solution(n: int = 600851475143) -> int: raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") - max_number = 0 - if isprime(n): return n - while n % 2 == 0: n //= 2 - if isprime(n): return n - for i in range(3, int(math.sqrt(n)) + 1, 2): if n % i == 0: if isprime(n / i): @@ -96,7 +86,6 @@ def solution(n: int = 600851475143) -> int: break elif isprime(i): max_number = i - return max_number diff --git a/project_euler/problem_03/sol2.py b/project_euler/problem_03/sol2.py index a8904573cedd..f28232109a84 100644 --- a/project_euler/problem_03/sol2.py +++ b/project_euler/problem_03/sol2.py @@ -9,7 +9,6 @@ def solution(n: int = 600851475143) -> int: """Returns the largest prime factor of a given number n. - >>> solution(13195) 29 >>> solution(10) @@ -41,19 +40,15 @@ def solution(n: int = 600851475143) -> int: raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") - prime = 1 i = 2 - while i * i <= n: while n % i == 0: prime = i n //= i i += 1 - if n > 1: prime = n - return int(prime) diff --git a/project_euler/problem_03/sol3.py b/project_euler/problem_03/sol3.py index 706ec9b2af06..676717cceca8 100644 --- a/project_euler/problem_03/sol3.py +++ b/project_euler/problem_03/sol3.py @@ -9,7 +9,6 @@ def solution(n: int = 600851475143) -> int: """Returns the largest prime factor of a given number n. - >>> solution(13195) 29 >>> solution(10) @@ -41,24 +40,17 @@ def solution(n: int = 600851475143) -> int: raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") - i = 2 ans = 0 - if n == 2: return 2 - while n > 2: while n % i != 0: i += 1 - ans = i - while n % i == 0: n = n / i - i += 1 - return int(ans) From 7dcdf967511fda7e5900484f5737ba8fa4a156e4 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 06:50:55 -0700 Subject: [PATCH 10/16] Remove unnecessary newlines --- project_euler/problem_03/sol1.py | 1 - project_euler/problem_03/sol2.py | 5 +---- project_euler/problem_03/sol3.py | 6 ------ 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/project_euler/problem_03/sol1.py b/project_euler/problem_03/sol1.py index 47e79fab4d51..22efeb2c4e90 100644 --- a/project_euler/problem_03/sol1.py +++ b/project_euler/problem_03/sol1.py @@ -37,7 +37,6 @@ def isprime(num: int) -> bool: for i in range(3, int(math.sqrt(num)) + 1, 2): if num % i == 0: return False - return True diff --git a/project_euler/problem_03/sol2.py b/project_euler/problem_03/sol2.py index d82beb34ec77..23bacc97c010 100644 --- a/project_euler/problem_03/sol2.py +++ b/project_euler/problem_03/sol2.py @@ -40,21 +40,18 @@ def solution(n: int = 600851475143) -> int: raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") - prime = 1 i = 2 - while i * i <= n: while n % i == 0: prime = i n //= i i += 1 - if n > 1: prime = n - return int(prime) if __name__ == "__main__": print(solution(int(input().strip()))) + diff --git a/project_euler/problem_03/sol3.py b/project_euler/problem_03/sol3.py index 7b4f6014b7c4..676717cceca8 100644 --- a/project_euler/problem_03/sol3.py +++ b/project_euler/problem_03/sol3.py @@ -40,22 +40,16 @@ def solution(n: int = 600851475143) -> int: raise TypeError("Parameter n must be int or passive of cast to int.") if n <= 0: raise ValueError("Parameter n must be greater or equal to one.") - i = 2 ans = 0 - if n == 2: return 2 - while n > 2: while n % i != 0: i += 1 - ans = i - while n % i == 0: n = n / i - i += 1 return int(ans) From 66e26b132e2db01104aae938cfc3b54103ff2ce6 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 06:55:43 -0700 Subject: [PATCH 11/16] Fix end of file for 2nd soln in PE problem 03 --- project_euler/problem_03/sol2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/project_euler/problem_03/sol2.py b/project_euler/problem_03/sol2.py index 23bacc97c010..f28232109a84 100644 --- a/project_euler/problem_03/sol2.py +++ b/project_euler/problem_03/sol2.py @@ -54,4 +54,3 @@ def solution(n: int = 600851475143) -> int: if __name__ == "__main__": print(solution(int(input().strip()))) - From 621c6a2641e875675eef2216ae5a9a60d1a9b145 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 11:38:27 -0700 Subject: [PATCH 12/16] Add style improvements to solutions for PE problem 04 --- project_euler/problem_04/sol1.py | 19 ++++--------------- project_euler/problem_04/sol2.py | 13 +++++++------ 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/project_euler/problem_04/sol1.py b/project_euler/problem_04/sol1.py index 227b594d0df7..4ddd8564c8ba 100644 --- a/project_euler/problem_04/sol1.py +++ b/project_euler/problem_04/sol1.py @@ -8,10 +8,9 @@ """ -def solution(n): +def solution(n: int = 998001) -> int: """Returns the largest palindrome made from the product of two 3-digit - numbers which is less than n. - + numbers which is less than n or -1 if no such product exists >>> solution(20000) 19591 >>> solution(30000) @@ -19,33 +18,23 @@ def solution(n): >>> solution(40000) 39893 >>> solution(10000) - Traceback (most recent call last): - ... - ValueError: That number is larger than our acceptable range. + -1 """ # fetches the next number for number in range(n - 1, 9999, -1): - # converts number into string. str_number = str(number) - # checks whether 'str_number' is a palindrome. if str_number == str_number[::-1]: - divisor = 999 - # if 'number' is a product of two 3-digit numbers # then number is the answer otherwise fetch next number. while divisor != 99: if (number % divisor == 0) and (len(str(number // divisor)) == 3.0): return number divisor -= 1 - raise ValueError("That number is larger than our acceptable range.") + return -1 if __name__ == "__main__": - import doctest - - doctest.testmod() - print(solution(int(input().strip()))) diff --git a/project_euler/problem_04/sol2.py b/project_euler/problem_04/sol2.py index 0f185f1216ab..d5dc0330da57 100644 --- a/project_euler/problem_04/sol2.py +++ b/project_euler/problem_04/sol2.py @@ -8,24 +8,25 @@ """ -def solution(n): +def solution(n: int = 998001) -> int: """Returns the largest palindrome made from the product of two 3-digit - numbers which is less than n. - + numbers which is less than n or -1 if no such product exists. >>> solution(20000) 19591 >>> solution(30000) 29992 >>> solution(40000) 39893 + >>> solution(10000) + -1 """ answer = 0 for i in range(999, 99, -1): # 3 digit numbers range from 999 down to 100 for j in range(999, 99, -1): - t = str(i * j) - if t == t[::-1] and i * j < n: + product_string = str(i * j) + if product_string == product_string[::-1] and i * j < n: answer = max(answer, i * j) - return answer + return -1 if answer == 0 else answer if __name__ == "__main__": From 6dbaafacb6b848c96fa54091cfae1c5ccd88ec18 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 20:24:41 -0700 Subject: [PATCH 13/16] Restore original newlines in soln for PE problem 04 --- project_euler/problem_04/sol1.py | 5 +++++ project_euler/problem_04/sol2.py | 1 + 2 files changed, 6 insertions(+) diff --git a/project_euler/problem_04/sol1.py b/project_euler/problem_04/sol1.py index 4ddd8564c8ba..eb3ff6693fe7 100644 --- a/project_euler/problem_04/sol1.py +++ b/project_euler/problem_04/sol1.py @@ -11,6 +11,7 @@ def solution(n: int = 998001) -> int: """Returns the largest palindrome made from the product of two 3-digit numbers which is less than n or -1 if no such product exists + >>> solution(20000) 19591 >>> solution(30000) @@ -22,11 +23,15 @@ def solution(n: int = 998001) -> int: """ # fetches the next number for number in range(n - 1, 9999, -1): + # converts number into string. str_number = str(number) + # checks whether 'str_number' is a palindrome. if str_number == str_number[::-1]: + divisor = 999 + # if 'number' is a product of two 3-digit numbers # then number is the answer otherwise fetch next number. while divisor != 99: diff --git a/project_euler/problem_04/sol2.py b/project_euler/problem_04/sol2.py index d5dc0330da57..ee62f422103e 100644 --- a/project_euler/problem_04/sol2.py +++ b/project_euler/problem_04/sol2.py @@ -11,6 +11,7 @@ def solution(n: int = 998001) -> int: """Returns the largest palindrome made from the product of two 3-digit numbers which is less than n or -1 if no such product exists. + >>> solution(20000) 19591 >>> solution(30000) From 2ebfe8e7941b9d99282e7771d5a3a315180a12fa Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 20:29:37 -0700 Subject: [PATCH 14/16] Fix punctuation in docstring for PE problem 04 --- project_euler/problem_04/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_04/sol1.py b/project_euler/problem_04/sol1.py index eb3ff6693fe7..6742103beac2 100644 --- a/project_euler/problem_04/sol1.py +++ b/project_euler/problem_04/sol1.py @@ -10,7 +10,7 @@ def solution(n: int = 998001) -> int: """Returns the largest palindrome made from the product of two 3-digit - numbers which is less than n or -1 if no such product exists + numbers which is less than n or -1 if no such product exists. >>> solution(20000) 19591 From ec76dc5e10c16be29af717cb94fc95a97b5be527 Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 21:14:43 -0700 Subject: [PATCH 15/16] Restore solution bodies for PE problem 04 --- project_euler/problem_04/sol1.py | 12 +++++++++--- project_euler/problem_04/sol2.py | 10 ++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/project_euler/problem_04/sol1.py b/project_euler/problem_04/sol1.py index 6742103beac2..42f56f3ef389 100644 --- a/project_euler/problem_04/sol1.py +++ b/project_euler/problem_04/sol1.py @@ -10,7 +10,7 @@ def solution(n: int = 998001) -> int: """Returns the largest palindrome made from the product of two 3-digit - numbers which is less than n or -1 if no such product exists. + numbers which is less than n. >>> solution(20000) 19591 @@ -19,7 +19,9 @@ def solution(n: int = 998001) -> int: >>> solution(40000) 39893 >>> solution(10000) - -1 + Traceback (most recent call last): + ... + ValueError: That number is larger than our acceptable range. """ # fetches the next number for number in range(n - 1, 9999, -1): @@ -38,8 +40,12 @@ def solution(n: int = 998001) -> int: if (number % divisor == 0) and (len(str(number // divisor)) == 3.0): return number divisor -= 1 - return -1 + raise ValueError("That number is larger than our acceptable range.") if __name__ == "__main__": + import doctest + + doctest.testmod() + print(solution(int(input().strip()))) diff --git a/project_euler/problem_04/sol2.py b/project_euler/problem_04/sol2.py index ee62f422103e..bd3ed919bdd2 100644 --- a/project_euler/problem_04/sol2.py +++ b/project_euler/problem_04/sol2.py @@ -10,7 +10,7 @@ def solution(n: int = 998001) -> int: """Returns the largest palindrome made from the product of two 3-digit - numbers which is less than n or -1 if no such product exists. + numbers which is less than n. >>> solution(20000) 19591 @@ -18,16 +18,14 @@ def solution(n: int = 998001) -> int: 29992 >>> solution(40000) 39893 - >>> solution(10000) - -1 """ answer = 0 for i in range(999, 99, -1): # 3 digit numbers range from 999 down to 100 for j in range(999, 99, -1): - product_string = str(i * j) - if product_string == product_string[::-1] and i * j < n: + t = str(i * j) + if t == t[::-1] and i * j < n: answer = max(answer, i * j) - return -1 if answer == 0 else answer + return answer if __name__ == "__main__": From f69539abc023e07ea68994bb9b65c07230470dfe Mon Sep 17 00:00:00 2001 From: Archaengel Date: Tue, 6 Oct 2020 21:31:29 -0700 Subject: [PATCH 16/16] Expand variable names for 2nd soln of PE problem 04 --- project_euler/problem_04/sol2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_04/sol2.py b/project_euler/problem_04/sol2.py index bd3ed919bdd2..8ee082ad2f6a 100644 --- a/project_euler/problem_04/sol2.py +++ b/project_euler/problem_04/sol2.py @@ -22,8 +22,8 @@ def solution(n: int = 998001) -> int: answer = 0 for i in range(999, 99, -1): # 3 digit numbers range from 999 down to 100 for j in range(999, 99, -1): - t = str(i * j) - if t == t[::-1] and i * j < n: + product_string = str(i * j) + if product_string == product_string[::-1] and i * j < n: answer = max(answer, i * j) return answer