Life Goes On

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

90問目

http://projecteuler.net/index.php?section=problems&id=90
2 つのサイコロの各面に、0 から 9 のうち任意の数字を選んで振り、それらを並べて 2 桁の数を作るとき、100 未満の平方数が全て表現できるような数字の選び方は何通りあるか求める。ただし 6 と 9 は交換可能とする。

import Data.List

main = print $ length euler090

euler090 = [ (as, bs) | (as:bss) <- init $ tails digits, bs <- bss,
    all (canDisplay (as, bs)) squares ]
    where digits = comb [0,1,2,3,4,5,6,7,8,6] 6
          squares = [(0,1),(0,4),(0,6),(1,6),(2,5),(3,6),(4,6),(6,4),(8,1)]

canDisplay :: ([Int], [Int]) -> (Int, Int) -> Bool
canDisplay (as, bs) (l, r) =
    (elem l as && elem r bs) || (elem l bs && elem r as)

comb :: [a] -> Int -> [[a]]
comb _ 0 = [[]]
comb xs n = [ x : xs' | (x:xss) <- init $ tails xs, xs' <- comb xss (n-1) ]