Project Euler 90

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


組合せを出して判定するだけ。

import qualified Data.Set as S

comb a 0 = [[]]
comb a n | length a < n = []
         | otherwise    = [ e:c | (e,b) <- f a, c <- comb b (n - 1) ] where
                f a = g [] a
                g a [] = []
                g a (x:xs) = (x,xs):(g (x:a) xs)

displays_all_square a1 a2 = disp s1 s2 [ n^2 | n <- [1..9] ] where
        s1 = S.fromList a1
        s2 = S.fromList a2
        disp s1 s2 [] = True
        disp s1 s2 (n:(ns)) = if b then disp s1 s2 ns else False where
                b = ((f d1 s1) && (f d2 s2)) || ((f d1 s2) && (f d2 s1))
                f 6 s = (S.member 6 s) || (S.member 9 s)
                f 9 s = f 6 s
                f d s = S.member d s
                d1 = div n 10
                d2 = mod n 10

main = print (sum [ f a1 a2 | a1 <- comb [0..9] 6,
                a2 <- comb [0..9] 6, displays_all_square a1 a2 ])
        where f a1 a2 = if compare a1 a2 == GT then 0 else 1