Project Euler 28

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


スパイラルの位置の列を作ります。

let count n = Seq.initInfinite (fun k -> k + n)

let spiral = seq {
    yield (0, 0)
    for n in count 1 do
        for y in n-1..-1..-n do
            yield (n, y)
        for x in n-1..-1..-n do
            yield (x, -n)
        for y in 1-n..n do
            yield (-n, y)
        for x in 1-n..n do
            yield (x, n)
}

let is_diagonal x = abs (fst (snd x)) = abs (snd (snd x))

let N = 1001
let s = Seq.zip (seq { 1..N*N }) spiral
printfn "%d" (Seq.sum (Seq.map fst (Seq.filter is_diagonal s)))