Files
project-euler/src/Python/Problem060.py
2023-04-01 16:04:44 +02:00

57 lines
1.5 KiB
Python

#!/usr/bin/env python
"""
Created on 04 Dic 2021
@author: David Doblas Jiménez
@email: daviddoji@pm.me
Solution for problem 060 of Project Euler
https://projecteuler.net/problem=60
"""
from utils import is_prime, list_primes, timeit
def solve_backtrack(max_chain_length, chain):
primes_list = list_primes(10_000)
for p in primes_list[1:]:
if p not in chain and is_concatenable(chain, p):
chain.append(p)
if len(chain) == max_chain_length:
return chain
solve_backtrack(max_chain_length, chain)
chain.pop()
return chain
def is_concatenable(chain, candidate):
for n in chain:
if not is_prime(int(str(n) + str(candidate))):
return False
if not is_prime(int(str(candidate) + str(n))):
return False
return True
@timeit("Problem 060")
def compute():
"""
The primes 3, 7, 109, and 673, are quite remarkable. By taking any two
primes and concatenating them in any order the result will always be prime.
For example, taking 7 and 109, both 7109 and 1097 are prime. The sum of
these four primes, 792, represents the lowest sum for a set of four primes
with this property.
Find the lowest sum for a set of five primes for which any two primes
concatenate to produce another prime.
"""
ans = solve_backtrack(5, [])
return sum(ans)
if __name__ == "__main__":
print(f"Result for Problem 060: {compute()}")