Project Euler 33

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


yieldを使うと簡単です。

let rec gcd x y = if x % y = 0 then y else gcd y (x % y)

let s = seq {
    for x in 11..99 do
        if x % 11 <> 0 then
            for y in x+1..99 do
                if x / 10 = y % 10 && (x % 10) * y = (y / 10) * x then
                    yield (x, y)
                else if x % 10 = y / 10 && (x / 10) * y = (y % 10) * x then
                    yield (x, y)
}

let mul p q = ((fst p) * (fst q), (snd p) * (snd q))
let f = Seq.fold mul (1, 1) s
printfn "%d" ((snd f) / (gcd (fst f) (snd f)))