From 21977f7854cdcf7310906843728b86195b83ebd6 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:01:34 +0800 Subject: [PATCH 01/19] [mypy] fix type annotations for problem003/sol1 and problem003/sol3 --- project_euler/problem_003/sol1.py | 4 ++-- project_euler/problem_003/sol3.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/project_euler/problem_003/sol1.py b/project_euler/problem_003/sol1.py index 3441dbf9e0b3..1f329984203a 100644 --- a/project_euler/problem_003/sol1.py +++ b/project_euler/problem_003/sol1.py @@ -92,8 +92,8 @@ def solution(n: int = 600851475143) -> int: return n for i in range(3, int(math.sqrt(n)) + 1, 2): if n % i == 0: - if isprime(n / i): - max_number = n / i + if isprime(n // i): + max_number = n // i break elif isprime(i): max_number = i diff --git a/project_euler/problem_003/sol3.py b/project_euler/problem_003/sol3.py index bc6f1d2f61ca..e13a0eb74ec1 100644 --- a/project_euler/problem_003/sol3.py +++ b/project_euler/problem_003/sol3.py @@ -57,7 +57,7 @@ def solution(n: int = 600851475143) -> int: i += 1 ans = i while n % i == 0: - n = n / i + n = n // i i += 1 return int(ans) From ce8598fabf080cdc1f9ddb42afd65306a24f104e Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:10:53 +0800 Subject: [PATCH 02/19] [mypy] fix type annotations for project euler problem007/sol2 --- project_euler/problem_007/sol2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_007/sol2.py b/project_euler/problem_007/sol2.py index b395c631b766..20c2ddf21ab8 100644 --- a/project_euler/problem_007/sol2.py +++ b/project_euler/problem_007/sol2.py @@ -73,7 +73,7 @@ def solution(nth: int = 10001) -> int: raise TypeError("Parameter nth must be int or castable to int.") from None if nth <= 0: raise ValueError("Parameter nth must be greater than or equal to one.") - primes = [] + primes: list[int] = [] num = 2 while len(primes) < nth: if isprime(num): From 63100dec59130496b7e1f8b06f62af8f93d4ed1e Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:12:18 +0800 Subject: [PATCH 03/19] [mypy] fix type annotations for project euler problem008/sol2 --- project_euler/problem_008/sol2.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_008/sol2.py b/project_euler/problem_008/sol2.py index 7f0540263278..889c3a3143c2 100644 --- a/project_euler/problem_008/sol2.py +++ b/project_euler/problem_008/sol2.py @@ -70,7 +70,9 @@ def solution(n: str = N) -> int: """ return max( - reduce(lambda x, y: int(x) * int(y), n[i : i + 13]) for i in range(len(n) - 12) + # mypy cannot properly interpret reduce + int(reduce(lambda x, y: str(int(x) * int(y)), n[i : i + 13])) + for i in range(len(n) - 12) ) From 0d6e0ee6ea1ebbea5bdc6a095720850e95d79e71 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:12:38 +0800 Subject: [PATCH 04/19] [mypy] fix type annotations for project euler problem009/sol1 --- project_euler/problem_009/sol1.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/project_euler/problem_009/sol1.py b/project_euler/problem_009/sol1.py index a58ea943e48b..4509d75bc670 100644 --- a/project_euler/problem_009/sol1.py +++ b/project_euler/problem_009/sol1.py @@ -38,6 +38,8 @@ def solution() -> int: if (a + b + c) == 1000: return a * b * c + return -1 + def solution_fast() -> int: """ @@ -58,6 +60,8 @@ def solution_fast() -> int: if a < b < c and (a ** 2) + (b ** 2) == (c ** 2): return a * b * c + return -1 + def benchmark() -> None: """ From 1f7c462221a5629ce89b3c500b91ca74999d1575 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:12:54 +0800 Subject: [PATCH 05/19] [mypy] fix type annotations for project euler problem014/sol1 --- project_euler/problem_014/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_014/sol1.py b/project_euler/problem_014/sol1.py index 1745ec931e5a..43aa4e726af2 100644 --- a/project_euler/problem_014/sol1.py +++ b/project_euler/problem_014/sol1.py @@ -44,7 +44,7 @@ def solution(n: int = 1000000) -> int: while number > 1: if number % 2 == 0: - number /= 2 + number //= 2 counter += 1 else: number = (3 * number) + 1 From 703742295aeae08e8374f46ca721c09d31f7889d Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:13:12 +0800 Subject: [PATCH 06/19] [mypy] fix type annotations for project euler problem 025/sol2 --- project_euler/problem_025/sol2.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_025/sol2.py b/project_euler/problem_025/sol2.py index ed3b54bb351f..b041afd98c86 100644 --- a/project_euler/problem_025/sol2.py +++ b/project_euler/problem_025/sol2.py @@ -23,9 +23,10 @@ What is the index of the first term in the Fibonacci sequence to contain 1000 digits? """ +from typing import Generator -def fibonacci_generator() -> int: +def fibonacci_generator() -> Generator[int, None, None]: """ A generator that produces numbers in the Fibonacci sequence From 8d09c054617ce349b38dbac79168a905ccfa25d8 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:13:28 +0800 Subject: [PATCH 07/19] [mypy] fix type annotations for project euler problem026/sol1.py --- project_euler/problem_026/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_026/sol1.py b/project_euler/problem_026/sol1.py index 64e0bbfef472..75d48df7910c 100644 --- a/project_euler/problem_026/sol1.py +++ b/project_euler/problem_026/sol1.py @@ -39,7 +39,7 @@ def solution(numerator: int = 1, digit: int = 1000) -> int: longest_list_length = 0 for divide_by_number in range(numerator, digit + 1): - has_been_divided = [] + has_been_divided: list[int] = [] now_divide = numerator for division_cycle in range(1, digit + 1): if now_divide in has_been_divided: From 3f5af6b389a0623a63620090281d9335ad3c23f0 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:13:43 +0800 Subject: [PATCH 08/19] [mypy] fix type annotations for project euler problem037/sol1 --- project_euler/problem_037/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_037/sol1.py b/project_euler/problem_037/sol1.py index 5423aac37c01..0411ad41ba2f 100644 --- a/project_euler/problem_037/sol1.py +++ b/project_euler/problem_037/sol1.py @@ -76,7 +76,7 @@ def compute_truncated_primes(count: int = 11) -> list[int]: >>> compute_truncated_primes(11) [23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797, 739397] """ - list_truncated_primes = [] + list_truncated_primes: list[int] = [] num = 13 while len(list_truncated_primes) != count: if validate(num): From 1542e1669dd825b3b11ca94148877d516ed757d3 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:14:06 +0800 Subject: [PATCH 09/19] [mypy] fix type annotations for project euler problem044/sol1 --- project_euler/problem_044/sol1.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/project_euler/problem_044/sol1.py b/project_euler/problem_044/sol1.py index d3ae6476d45f..3b75b6a56a8e 100644 --- a/project_euler/problem_044/sol1.py +++ b/project_euler/problem_044/sol1.py @@ -42,6 +42,8 @@ def solution(limit: int = 5000) -> int: if is_pentagonal(a) and is_pentagonal(b): return b + return -1 + if __name__ == "__main__": print(f"{solution() = }") From 346d3ef1b50340c05c7d3fb045c853f7b580cf34 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:14:27 +0800 Subject: [PATCH 10/19] [mypy] fix type annotations for project euler problem046/sol1 --- project_euler/problem_046/sol1.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/project_euler/problem_046/sol1.py b/project_euler/problem_046/sol1.py index 3fdf567551cc..550c4c7c4268 100644 --- a/project_euler/problem_046/sol1.py +++ b/project_euler/problem_046/sol1.py @@ -85,6 +85,8 @@ def compute_nums(n: int) -> list[int]: if len(list_nums) == n: return list_nums + return [] + def solution() -> int: """Return the solution to the problem""" From 5d8bbb39d1cf4cd5d3365a120d2171635d12e12b Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:14:41 +0800 Subject: [PATCH 11/19] [mypy] fix type annotations for project euler problem051/sol1 --- project_euler/problem_051/sol1.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/project_euler/problem_051/sol1.py b/project_euler/problem_051/sol1.py index 5f607e3ffb42..eedb02379e62 100644 --- a/project_euler/problem_051/sol1.py +++ b/project_euler/problem_051/sol1.py @@ -63,12 +63,12 @@ def digit_replacements(number: int) -> list[list[int]]: >>> digit_replacements(3112) [[3002, 3112, 3222, 3332, 3442, 3552, 3662, 3772, 3882, 3992]] """ - number = str(number) + number_str = str(number) replacements = [] digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] - for duplicate in Counter(number) - Counter(set(number)): - family = [int(number.replace(duplicate, digit)) for digit in digits] + for duplicate in Counter(number_str) - Counter(set(number_str)): + family = [int(number_str.replace(duplicate, digit)) for digit in digits] replacements.append(family) return replacements @@ -106,6 +106,8 @@ def solution(family_length: int = 8) -> int: return min(primes_in_family) + return -1 + if __name__ == "__main__": print(solution()) From 68341b9cde7bfc9d47bc0ba062dd56fe0a49fb11 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:14:55 +0800 Subject: [PATCH 12/19] [mypy] fix type annotations for project euler problem074/sol2 --- project_euler/problem_074/sol2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_074/sol2.py b/project_euler/problem_074/sol2.py index 689593277a81..55e67c6b98dd 100644 --- a/project_euler/problem_074/sol2.py +++ b/project_euler/problem_074/sol2.py @@ -20,8 +20,8 @@ counter increases. """ -factorial_cache = {} -factorial_sum_cache = {} +factorial_cache: dict[int, int] = {} +factorial_sum_cache: dict[int, int] = {} def factorial(a: int) -> int: From 881b318c4f412f2d278412289880706d49c021ad Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:15:16 +0800 Subject: [PATCH 13/19] [mypy] fix type annotations for project euler problem080/sol1 --- project_euler/problem_080/sol1.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_080/sol1.py b/project_euler/problem_080/sol1.py index 517be3fc0ba8..916998bdd8ad 100644 --- a/project_euler/problem_080/sol1.py +++ b/project_euler/problem_080/sol1.py @@ -26,8 +26,8 @@ def solution() -> int: sqrt_number = number.sqrt(decimal_context) if len(str(sqrt_number)) > 1: answer += int(str(sqrt_number)[0]) - sqrt_number = str(sqrt_number)[2:101] - answer += sum(int(x) for x in sqrt_number) + sqrt_number_str = str(sqrt_number)[2:101] + answer += sum(int(x) for x in sqrt_number_str) return answer @@ -35,3 +35,4 @@ def solution() -> int: import doctest doctest.testmod() + print(f"{solution() = }") From 731d73f015741045fee2dcab2a8eb9a7d118c45c Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:15:29 +0800 Subject: [PATCH 14/19] [mypy] fix type annotations for project euler problem099/sol1 --- project_euler/problem_099/sol1.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/project_euler/problem_099/sol1.py b/project_euler/problem_099/sol1.py index 88912e1f0f9e..bf5621c6583c 100644 --- a/project_euler/problem_099/sol1.py +++ b/project_euler/problem_099/sol1.py @@ -22,12 +22,14 @@ def solution(data_file: str = "base_exp.txt") -> int: >>> solution() 709 """ - largest = [0, 0] + largest: float = 0 + result = 0 for i, line in enumerate(open(os.path.join(os.path.dirname(__file__), data_file))): a, x = list(map(int, line.split(","))) - if x * log10(a) > largest[0]: - largest = [x * log10(a), i + 1] - return largest[1] + if x * log10(a) > largest: + largest = x * log10(a) + result = i + 1 + return result if __name__ == "__main__": From bcc663634f51b7b45fc8bca08e4c44fa88e8d3a1 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:15:47 +0800 Subject: [PATCH 15/19] [mypy] fix type annotations for project euler problem101/sol1 --- project_euler/problem_101/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_101/sol1.py b/project_euler/problem_101/sol1.py index 553f8f442bb8..14013c435241 100644 --- a/project_euler/problem_101/sol1.py +++ b/project_euler/problem_101/sol1.py @@ -202,7 +202,7 @@ def solution(func: Callable[[int], int] = question_function, order: int = 10) -> ] ret: int = 0 - poly: int + poly: Callable[[int], int] x_val: int for poly in polynomials: From e77804f94427480c6657bbbcbdcdff6191bbf5a4 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:16:00 +0800 Subject: [PATCH 16/19] [mypy] fix type annotations for project euler problem188/sol1 --- project_euler/problem_188/sol1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_188/sol1.py b/project_euler/problem_188/sol1.py index 6473c63620ed..c8cd9eb10aeb 100644 --- a/project_euler/problem_188/sol1.py +++ b/project_euler/problem_188/sol1.py @@ -19,7 +19,7 @@ """ -# small helper function for modular exponentiation +# small helper function for modular exponentiation (fast exponentiation algorithm) def _modexpt(base: int, exponent: int, modulo_value: int) -> int: """ Returns the modular exponentiation, that is the value @@ -36,7 +36,7 @@ def _modexpt(base: int, exponent: int, modulo_value: int) -> int: if exponent == 1: return base if exponent % 2 == 0: - x = _modexpt(base, exponent / 2, modulo_value) % modulo_value + x = _modexpt(base, exponent // 2, modulo_value) % modulo_value return (x * x) % modulo_value else: return (base * _modexpt(base, exponent - 1, modulo_value)) % modulo_value From 4dc5eaf9125000cc8b6eef661b86b7538f2da6c5 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:16:10 +0800 Subject: [PATCH 17/19] [mypy] fix type annotations for project euler problem191/sol1 --- project_euler/problem_191/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_191/sol1.py b/project_euler/problem_191/sol1.py index 38325b363b89..6bff9d54eeca 100644 --- a/project_euler/problem_191/sol1.py +++ b/project_euler/problem_191/sol1.py @@ -26,7 +26,7 @@ """ -cache = {} +cache: dict[tuple[int, int, int], int] = {} def _calculate(days: int, absent: int, late: int) -> int: From 4ed266a420f2b2e4e8139094797525e99d74ddc1 Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:16:25 +0800 Subject: [PATCH 18/19] [mypy] fix type annotations for project euler problem207/sol1 --- project_euler/problem_207/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_207/sol1.py b/project_euler/problem_207/sol1.py index fb901fde1624..99d1a91746d2 100644 --- a/project_euler/problem_207/sol1.py +++ b/project_euler/problem_207/sol1.py @@ -90,7 +90,7 @@ def solution(max_proportion: float = 1 / 12345) -> int: perfect_partitions += 1 if perfect_partitions > 0: if perfect_partitions / total_partitions < max_proportion: - return partition_candidate + return int(partition_candidate) integer += 1 From 39eae36de8d8a01ee22d317c8229a8c9dcda0b3c Mon Sep 17 00:00:00 2001 From: Joyce Date: Thu, 9 Sep 2021 17:16:37 +0800 Subject: [PATCH 19/19] [mypy] fix type annotations for project euler problem551/sol1 --- project_euler/problem_551/sol1.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/project_euler/problem_551/sol1.py b/project_euler/problem_551/sol1.py index 71956691a56d..005d2e98514b 100644 --- a/project_euler/problem_551/sol1.py +++ b/project_euler/problem_551/sol1.py @@ -12,9 +12,10 @@ Find a(10^15) """ + ks = [k for k in range(2, 20 + 1)] base = [10 ** k for k in range(ks[-1] + 1)] -memo = {} +memo: dict[int, dict[int, list[list[int]]]] = {} def next_term(a_i, k, i, n):