1 ! Copyright (C) 2018 John Benediktsson
2 ! See https://factorcode.org/license.txt for BSD license
4 USING: backtrack backtrack.private combinators.short-circuit
5 kernel math math.functions math.primes
6 project-euler.common sequences ;
10 ! https://projecteuler.net/problem=60
15 ! The primes 3, 7, 109, and 673, are quite remarkable. By taking
16 ! any two primes and concatenating them in any order the result
17 ! will always be prime. For example, taking 7 and 109, both 7109
18 ! and 1097 are prime. The sum of these four primes, 792,
19 ! represents the lowest sum for a set of four primes with this
22 ! Find the lowest sum for a set of five primes for which any two
23 ! primes concatenate to produce another prime.
29 : join-numbers ( m n -- x )
30 over log10 ceiling >integer 10^ * + ;
32 : prime-pair? ( m n -- ? )
34 [ join-numbers prime? ]
35 [ swap join-numbers prime? ]
38 :: (euler060) ( -- primes )
41 10000 primes-upto :> primes1
43 primes1 amb-integer :> i
45 primes1 i 1 + tail-slice [
46 { [ 4 * a + result < ] [ a prime-pair? ] } 1&&
49 primes2 amb-integer :> j
51 primes2 j 1 + tail-slice [
52 { [ 3 * a b + + result < ] [ b prime-pair? ] } 1&&
55 primes3 amb-integer :> k
57 primes3 k 1 + tail-slice [
58 { [ 2 * a b c + + + result < ] [ c prime-pair? ] } 1&&
61 primes4 amb-integer :> l
63 primes4 l 1 + tail-slice [
64 { [ a b c d + + + + result < ] [ d prime-pair? ] } 1&&
69 { a b c d e } dup sum result!
72 : euler060 ( -- answer )