111問目
http://projecteuler.net/index.php?section=problems&id=111
1 を 3 つ含むような 4 桁の素数は以下のように 9 個ある。
1117, 1151, 1171, 1181, 1511, 1811, 2111, 4111, 8111
n 桁の素数で、数字 d が最も多く含まれるような数の和を S(n, d) とおくとき、d = 0 から 9 に対して、S(10, d) の和を求める。
同じ数字を 9 つ含むような数を調べたら 0, 2, 8 については素数がありませんでした。
import Data.Char main = print $ sum $ euler111 euler111 :: [Integer] euler111 = filter isPrime $ map (read . map intToDigit) $ filter ((/= 0) . head) $ [ as ++ [n] ++ bs | m <- [1,3,4,5,6,7,9], i <- [0..9], n <- filter (/= m) [0..9], let (as, bs) = splitAt i $ replicate 9 m ] -- 1,3,4,5,6,7,9 ++ [ as ++ [n1] ++ bs ++ [n2] | m <- [0,2,8], i <- [0..8], n1 <- filter (/= m) [0..9], n2 <- [1,3,7,9], let (as, bs) = splitAt i $ replicate 8 m ] -- 0,2,8 isPrime :: Integer -> Bool isPrime x = all ((/= 0) . mod x) $ takeWhile (<= (floor $ sqrt $ fromIntegral x)) primes primes :: [Integer] primes = 2 : filter isPrime [3..]