JuliaでProject Euler(2)

Problem 2

https://projecteuler.net/problem=2

Juliaで次のように書く。

function e002(N)
    local s = 0
    local a = 1
    local b = 1
    while b <= N
        if b%2 == 0
            s += b
        end
        a, b = b, a+b
    end
    return s
end

N = parse(Int, ARGS[1])
println(e002(N))

Pythonのタプルで代入は使える。ちなみに配列は同様にできないらしい。

generator

Fibonacci数列をgeneratorで排出できればきれいに書くことができるが、Juliaでgeneratorを使うには次のように書けばよい。

fibs() = Channel() do c
    local a = 1
    local b = 1
    while true
        push!(c, b)
        a, b = b, a+b
    end
end

function e002a(N)
    local s = 0
    for f in fibs()
        if f > N
            break
        elseif f%2 == 0
            s += f
        end
    end
    return s
end

N = parse(Int, ARGS[1])
println(e002a(N))

あまりきれいになっていないように思えるが、気のせいだろうか。Juliaにはどうもtakewhileがないようなのだ。takewhileなんか使ったら遅くなるに決まっているからだろうか。
generatorは、ここではcという入れ物を用意して、そこにpushすることで実現しているっぽい。