#!/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()}")