Life Goes On

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

37問目

3797→797→97→7、3797→379→37→3というように左右どちらから切り落としていっても全て素数となるような素数のうち、最初の11個を足し合わせる。

import Data.List

main = print $ sum $ euler037

euler037 :: [Int]
euler037 = take 11 $ filter truncatable $ dropWhile (< 10) primes

truncatable :: Int -> Bool
truncatable n = all (isPrime . read) (initsAndTails $ show n)
    where initsAndTails xs = filter (/= xs) $ filter (/= "") $ (inits xs ++ tails xs)

primes :: [Int]
primes = 2 : filter isPrime [3..]

isPrime :: Int -> Bool
isPrime 1 = False
isPrime x = all ((/= 0) . mod x) $
    takeWhile (<= (floor $ sqrt $ fromIntegral x)) primes