]> gitweb.factorcode.org Git - factor.git/commitdiff
project-euler.060: solution for #60.
authorJohn Benediktsson <mrjbq7@gmail.com>
Tue, 27 Feb 2018 04:43:35 +0000 (20:43 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Tue, 27 Feb 2018 04:43:35 +0000 (20:43 -0800)
extra/project-euler/060/060-tests.factor [new file with mode: 0644]
extra/project-euler/060/060.factor [new file with mode: 0644]

diff --git a/extra/project-euler/060/060-tests.factor b/extra/project-euler/060/060-tests.factor
new file mode 100644 (file)
index 0000000..e1a0c3c
--- /dev/null
@@ -0,0 +1,6 @@
+
+USING: project-euler.060 tools.test ;
+
+IN: project-euler.060
+
+{ 26033 } [ euler060 ] unit-test
diff --git a/extra/project-euler/060/060.factor b/extra/project-euler/060/060.factor
new file mode 100644 (file)
index 0000000..95311bb
--- /dev/null
@@ -0,0 +1,75 @@
+! Copyright (C) 2018 John Benediktsson
+! See http://factorcode.org/license.txt for BSD license
+
+USING: backtrack backtrack.private combinators.short-circuit
+kernel locals math math.functions math.primes
+project-euler.common sequences ;
+
+IN: project-euler.060
+
+! http://projecteuler.net/problem=60
+
+! DESCRIPTION
+! -----------
+
+! 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.
+
+
+! SOLUTION
+! --------
+
+: join-numbers ( m n -- x )
+    over log10 ceiling >integer 10^ * + ;
+
+: prime-pair? ( m n -- ? )
+    {
+        [ join-numbers prime? ]
+        [ swap join-numbers prime? ]
+    } 2&& ;
+
+:: (euler060) ( -- primes )
+    [
+        1/0. :> result!
+        10000 primes-upto :> primes1
+
+        primes1 amb-integer :> i
+        i primes1 nth :> a
+        primes1 i 1 + tail-slice [
+            { [ 4 * a + result < ] [ a prime-pair? ] } 1&&
+        ] filter :> primes2
+
+        primes2 amb-integer :> j
+        j primes2 nth :> b
+        primes2 j 1 + tail-slice [
+            { [ 3 * a b + + result < ] [ b prime-pair? ] } 1&&
+        ] filter :> primes3
+
+        primes3 amb-integer :> k
+        k primes3 nth :> c
+        primes3 k 1 + tail-slice [
+            { [ 2 * a b c + + + result < ] [ c prime-pair? ] } 1&&
+        ] filter :> primes4
+
+        primes4 amb-integer :> l
+        l primes4 nth :> d
+        primes4 l 1 + tail-slice [
+            { [ a b c d + + + + result < ] [ d prime-pair? ] } 1&&
+        ] filter :> primes5
+
+        primes5 amb-lazy :> e
+
+        { a b c d e } dup sum result!
+    ] bag-of last ;
+
+: euler060 ( -- answer )
+    (euler060) sum ;
+
+SOLUTION: euler060