1
- from collections import Counter
2
-
3
1
"""
4
2
https://projecteuler.net/problem=51
5
3
Prime digit replacements
18
16
adjacent digits) with the same digit, is part of an eight prime value family.
19
17
"""
20
18
19
+ from collections import Counter
20
+ from typing import List
21
21
22
- def sieve (n : int ) -> list :
22
+
23
+ def prime_sieve (n : int ) -> List [int ]:
23
24
"""
24
25
Sieve of Erotosthenes
25
26
Function to return all the prime numbers up to a certain number
26
27
https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
27
28
28
- >>> sieve (3)
29
+ >>> prime_sieve (3)
29
30
[2]
30
31
31
- >>> sieve (50)
32
+ >>> prime_sieve (50)
32
33
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
33
34
"""
34
35
is_prime = [True ] * n
@@ -51,7 +52,7 @@ def sieve(n: int) -> list:
51
52
return primes
52
53
53
54
54
- def digit_replacements (number : int ) -> list :
55
+ def digit_replacements (number : int ) -> List [ List [ int ]] :
55
56
"""
56
57
Returns all the possible families of digit replacements in a number which
57
58
contains at least one repeating digit
@@ -73,18 +74,22 @@ def digit_replacements(number: int) -> list:
73
74
return replacements
74
75
75
76
76
- def solution () -> int :
77
+ def solution (family_length : int = 8 ) -> int :
77
78
"""
78
79
Returns the solution of the problem
79
80
80
- >>> solution()
81
- 121313
81
+ >>> solution(2)
82
+ 229399
83
+
84
+ >>> solution(3)
85
+ 221311
82
86
"""
83
87
numbers_checked = set ()
84
- primes = set (sieve (1_000_000 ))
85
88
86
89
# Filter primes with less than 3 replaceable digits
87
- primes = {x for x in primes if len (str (x )) - len (set (str (x ))) >= 3 }
90
+ primes = {
91
+ x for x in set (prime_sieve (1_000_000 )) if len (str (x )) - len (set (str (x ))) >= 3
92
+ }
88
93
89
94
for prime in primes :
90
95
if prime in numbers_checked :
@@ -96,7 +101,7 @@ def solution() -> int:
96
101
numbers_checked .update (family )
97
102
primes_in_family = primes .intersection (family )
98
103
99
- if len (primes_in_family ) != 8 :
104
+ if len (primes_in_family ) != family_length :
100
105
continue
101
106
102
107
return min (primes_in_family )
0 commit comments