Life Goes On

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

50問目

http://projecteuler.net/index.php?section=problems&id=50
41 = 2 + 3 + 5 + 7 + 11 + 13は6つの連続する素数の和として表現できる。百万未満の素数で、最も長く連続する素数の和となるものを求める。
連続する素数の和が百万未満で、長さが最も長くなるときを求め、そこから一つずつ長さを減らしながら和が素数となる場合があるかを調べています。

import Data.List

main = print $ euler050 1000000

euler050 :: Int -> Int
euler050 max = head $ concatMap (sums max) $ [maxLen,maxLen-1..1]
    where maxLen = length $ takeWhile (< max) $ scanl1 (+) primes

sums :: Int -> Int -> [Int]
sums max n = filter isPrime $ takeWhile (< max) $ map (sum . take n) $ tails primes

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

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