project-euler.060: solution for #60.
							parent
							
								
									ce1de81ec6
								
							
						
					
					
						commit
						93bd01109d
					
				| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					USING: project-euler.060 tools.test ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IN: project-euler.060
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 26033 } [ euler060 ] unit-test
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
		Loading…
	
		Reference in New Issue