JuliaでProject Euler(20)

Problem 25

https://projecteuler.net/problem=25

function add(v1, v2)
    if length(v1) > length(v2)
        return add(v2, v1)
    end
    v3::Array{Int} = []
    carry = 0
    for k in 1:length(v1)
        n = v1[k] + v2[k] + carry
        carry = div(n, 10)
        d = n % 10
        push!(v3, d)
    end
    
    for l in length(v1)+1:length(v2)
        n = v2[l] + carry
        carry = div(n, 10)
        d = n % 10
        push!(v3, d)
    end
    if carry > 0
        push!(v3, carry)
    end
    return v3
end

fibs() = Channel() do c
    a, b = [1], [1]
    push!(c, a)
    while true
        a, b = b, add(a, b)
        push!(c, b)
    end
end

function e025(N)
    x = first(Iterators.filter(x -> length(x[2]) == N, enumerate(fibs())))
    return x[1]
end

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

fibsの部分は次のようにも書ける。

function fibs(c::Channel)
    a, b = [1], [1]
    push!(c, a)
    while true
        a, b = b, add(a, b)
        push!(c, b)
    end
end

function e025(N)
    x = first(Iterators.filter(x -> length(x[2]) == N,
                            enumerate(Channel(c -> fibs(c)))))
    return x[1]
end

関数っぽくなるが、だいぶ長くなる。