I have a challenge to find the prime number closest to any given integer n that has the maximum number of even digits. The code below works and passes all the sample tests. But it times out when the numbers grow too large. Can anyone suggest how I may optimize it?
from collections import defaultdict
def is_prime(n):
first, i = 1, 2
if n <= first:
return False
while i <= (n**0.5):
if n % i == 0:
return False
i += first
return True
def highest_prime(n):
dd = defaultdict(int)
nums = [str(x) for x in reversed(range(n)) if is_prime(x)]
is_even = (lambda x: x % 2 == 0)
for outer in nums:
for inner in outer:
if is_even(int(inner)):
dd[outer] += 1
return max(dd, key=lambda x: dd[x])
if __name__ == "__main__":
print(highest_prime(1000))
print(highest_prime(1210))
print(highest_prime(10000))
test 1 expected value is 887
test 2 expected value is 1201
test 3 expected value is 8887
Edit: Per the suggestions, since the maximum count of prime digits in a number will always be one less than the total number of digits, I have kept only those numbers whose length is the same as the given integer N. But it still isn't fast enough. For the primality check I used the selected answer at isPrime Function for Python Language
def highest_prime(n):
nums = list(range(n))
temp = []
for x in range(len(nums)):
if len(str(nums[x])) == len(str(nums[-1])):
if is_prime(nums[x]):
temp.append(str(nums[x]))
is_even = (lambda x: x % 2 == 0)
dd = defaultdict(int)
for outer in temp[::-1]:
for inner in outer:
if is_even(int(inner)):
dd[outer] += 1
return max(dd, key=lambda x: dd[x])
Any other suggestions? Thanks!