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) ]