Project Euler 32

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


yieldを使うと何でも簡単に書けます。値を束縛できないところが問題ですが。

let rec digits n = if n = 0 then [] else (digits (n / 10)) @ [n % 10]
let rec pow n e = if e = 0 then 1 else n * (pow n (e - 1))

let is_pandigital a b c =
    let flag = List.fold (fun x y -> x ||| (1 <<< y)) 0
                        ((digits a) @ (digits b) @ (digits c))
    flag = 1022

let s = seq {
    for k in 1..2 do
        for m in pow 10 (k - 1)..(pow 10 k) - 1 do
            for n in pow 10 (4 - k)..((pow 10 4) - 1) / m do
                if is_pandigital m n (m * n) then
                    yield m * n
}

printfn "%d" (Set.fold (fun x y -> x + y) 0 (Set.ofSeq s))