Problem 17
https://projecteuler.net/problem=17
何度も解いているが、一度も最初で正しい答えを出した記憶がない。
できるだけ再帰を使う。
function e017(N) function num_length(n) if haskey(num_letters, n) && n < 100 return length(num_letters[n]) elseif n < 100 d = n%10 return num_length(n-d) + num_length(d) elseif n < 1000 d = div(n, 100) r = n%100 if r == 0 return num_length(d) + length(num_letters[100]) else return num_length(d*100) + 3 + num_length(r) end else d = div(n, 1000) r = n%1000 if r == 0 return num_length(d) + length(num_letters[1000]) else return num_length(d*1000) + 3 + num_length(r) end end end num_letters = Dict( 0 => "", 1 => "one", 2 => "two", 3 => "three", 4 => "four", 5 => "five", ... ) return sum(num_length(n) for n in 1:N) end N = parse(Int, ARGS[1]) println(e017(N))