euler/Problem051.hs

31 lines
1.2 KiB
Haskell

-- By replacing the 1st digit of the 2-digit number *3, it turns out that six
-- of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime.
--
-- By replacing the 3rd and 4th digits of 56**3 with the same digit, this
-- 5-digit number is the first example having seven primes among the ten
-- generated numbers, yielding the family: 56003, 56113, 56333, 56443, 56663,
-- 56773, and 56993. Consequently 56003, being the first member of this family,
-- is the smallest prime with this property.
--
-- Find the smallest prime which, by replacing part of the number (not
-- necessarily adjacent digits) with the same digit, is part of an eight prime
-- value family.
import Euler
import Debug.Trace
isPrime :: Integer -> Bool
isPrime n = n >= 2 && all (\p -> n `mod` p /= 0) smallPrimes
where smallPrimes = takeWhile (<= floor (sqrt (fromIntegral n))) primes
main = print $ head $ do
base <- primes
let digits = toDigits base
template <- sequenceA <$> mapM (\n -> [const n, id]) digits
let family = nub $ filter isPrime $ map fromDigits $
filter ((/= 0) . head) $ map template [0..9]
guard $ take 1 family == [base]
guard $ length family >= 8
traceM $ show family
return base