Project Euler 87

http://projecteuler.net/index.php?section=problems&id=87


素直に取りうる値のリストを作ってSetに入れて大きさを見る。

import Data.Set (fromList, size)

is_prime n = all (\p -> mod n p /= 0) (takeWhile (\p -> p * p <= n) primes)
primes = 2:[ n | n <- [3,5..], is_prime n ]

limit = 5 * 10^7
a = [ p + q + r | p <- takeWhile (<limit) (map (^2) primes),
                  q <- takeWhile (<limit-p) (map (^3) primes),
                  r <- takeWhile (<limit-p-q) (map (^4) primes) ]
main = print (size (fromList a))