Project Euler: Problem41

pandigital の中で最大の素数を求める。1桁から9桁までの pandigital は40万個くらい。このままだとスタックオーバーフローする。

import Data.List

pandigitals 0 _ = return 0
pandigitals n xs = do x   <- xs
                      xs' <- pandigitals (n-1) (filter (/=x) xs)
                      return $ xs'*10 + x
pandigital = concatMap (\n -> sort $ pandigitals n [n,n-1..1]) [9,8..1]
primePandigital = loop 2 pandigital
    where loop n ps
              | n*2 > head ps = ps
              | otherwise     = loop (n+1) $ filter (\x -> rem x n /= 0) ps
main = print $ maximum primePandigital