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