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
関数っぽくなるが、だいぶ長くなる。