Life Goes On

まあまあだけど楽しんでる方です

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..]