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