44 lines
1.3 KiB
Haskell
44 lines
1.3 KiB
Haskell
-- Problem 60
|
|
-- 02 January 2004
|
|
--
|
|
-- 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.
|
|
--
|
|
|
|
import Prime
|
|
|
|
|
|
numOfDigits x
|
|
| x < 10 = 1
|
|
| x < 100 = 2
|
|
| x < 1000 = 3
|
|
| x < 10000 = 4
|
|
| x < 100000 = 5
|
|
| x < 1000000 = 6
|
|
| x < 10000000 = 7
|
|
-- | otherwise = truncate (logBase 10 x)
|
|
|
|
-- equivalent but faster than "read (show x ++ show y)"
|
|
concatNumbers :: Int -> Int -> Int
|
|
concatNumbers x y = (10^numOfDigits y)*x + y
|
|
|
|
solve = do
|
|
a <- primesTo10000
|
|
let m = f a $ dropWhile (<= a) primesTo10000
|
|
b <- m
|
|
let n = f b $ dropWhile (<= b) m
|
|
c <- n
|
|
let o = f c $ dropWhile (<= c) n
|
|
d <- o
|
|
let p = f d $ dropWhile (<= d) o
|
|
e <- p
|
|
return [a,b,c,d,e]
|
|
where
|
|
f x = filter (\y -> all is_prime [concatNumbers x y, concatNumbers y x])
|
|
primesTo10000 = takeWhile (<= 10000) primes
|
|
|
|
|
|
main = do
|
|
print $ head $ solve
|
|
print $ sum $ head $ solve
|