Project Euler 39

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


配列を使うと簡単。

open Seq

// p = 2lm(m + n)
let N = 1000
let count_peri = Array.create (N + 1) 0
for m in takeWhile (fun m -> 2 * m * (m + 1) <= N) (seq { 2..N }) do
    // n' = m + n
    for n' in takeWhile (fun n' -> 2 * m * n' <= N)
                    (filter (fun n' -> n' % 2 = 1) (seq { m+1..m*2-1 })) do
        let p = 2 * m * n'
        for q in p..p..N do
            count_peri.[q] <- count_peri.[q] + 1

let larger x y = if snd x >= snd y then x else y
printfn "%d" (fst (fold larger (0, 0)
                            (seq { for k in 1..N -> (k, count_peri.[k]) })))