Skip to content

Instantly share code, notes, and snippets.

@pragtich
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pragtich/44b816b6dbf8aec7907f to your computer and use it in GitHub Desktop.
Save pragtich/44b816b6dbf8aec7907f to your computer and use it in GitHub Desktop.
Actual algorithm for Euler problem 37
from itertools import chain
def rtrunc_primes():
"""Generate a set of all right-truncatable primes"""
rprimes = [[2, 3, 5, 7]] # Seed with 1-digit primes
rdigits = [1, 3, 7, 9] # Only possible digits after first digit
n = 2
while rprimes[n-2]: # Continue as long as we have found a prime in the previous n
nprimes = [p for base in rprimes[n-2] for p in [10*base+d for d in rdigits ] if is_prime (p)]
rprimes.append(nprimes)
n += 1
return {p for p in chain.from_iterable(rprimes)}
def ltrunc_primes():
"""Generate a set of all left-truncatable primes"""
lprimes = [[2, 3, 5, 7]] # Seed with 1-digit primes
ldigits = range(1,10) # Only possible digits after first digit
n = 2
factor = 1
while lprimes[n-2]: # Continue as long as we have found a prime in the previous n
factor *= 10 # We need to stick the digits to the front, so mult with factor
nprimes = [p for base in lprimes[n-2] for p in [base + l * factor for l in ldigits] if is_prime(p)]
lprimes.append(nprimes)
n += 1
return {p for p in chain.from_iterable(lprimes)}
rtrunc_primes = rtrunc_primes()
ltrunc_primes = ltrunc_primes()
tprimes = sorted(list(rtrunc_primes & ltrunc_primes))
print "Truncatable primes: ", tprimes
print "Sum minus 1-digit primes: ", sum(tprimes[4:])
print "Number of truncatable primes: ", len(tprimes)
@pragtich
Copy link
Author

Guess list comprehensions could make these easier to read. Or shorter at least

Nprimes.append ( [ 10*base+p for p in rdigits if is_prime (base*10+r)])
or
Nprimes.append ( [ p for p in [10*base+d for d in rdigits ] if is_prime (p)])

@pragtich
Copy link
Author

Could this actually work?

nprimes = [p for base in rprimes[n-2] for p in [10*base+d for d in rdigits ] if is_prime (p)]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment