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