Improve performance

This commit is contained in:
David Doblas Jiménez 2021-07-28 21:35:16 +02:00
parent 22589584c7
commit a5f4ffec49

View File

@ -8,32 +8,23 @@ Solution for Problem 17 of Project Euler
https://projecteuler.net/problem=17 https://projecteuler.net/problem=17
=# =#
function num2letters(num) function num2letters(num, dic)
nums = Dict(
0 => "", 1 => "one", 2 => "two", 3 => "three", 4 => "four", 5 => "five",
6 => "six", 7 => "seven", 8 => "eight", 9 => "nine", 10 => "ten",
11 => "eleven", 12 => "twelve", 13 => "thirteen", 14 => "fourteen",
15 => "fifteen", 16 => "sixteen", 17 => "seventeen", 18 => "eighteen",
19 => "nineteen", 20 => "twenty", 30 => "thirty", 40 => "forty",
50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty",
90 => "ninety", 100 => "hundred", 1000 => "thousand"
)
if num <= 20 if num <= 20
return length(nums[num]) return length(dic[num])
elseif num < 100 elseif num < 100
tens, units = divrem(num, 10) tens, units = divrem(num, 10)
return length(nums[tens * 10]) + num2letters(units) return length(dic[tens * 10]) + num2letters(units, dic)
elseif num < 1000 elseif num < 1000
hundreds, rest = divrem(num, 100) hundreds, rest = divrem(num, 100)
if rest != 0 if rest != 0
return num2letters(hundreds) + length(nums[100]) + length("and") + num2letters(rest) return num2letters(hundreds, dic) + length(dic[100])
+ length("and") + num2letters(rest, dic)
else else
return num2letters(hundreds) + length(nums[100]) return num2letters(hundreds, dic) + length(dic[100])
end end
else else
thousands, rest = divrem(num, 1000) thousands, rest = divrem(num, 1000)
return num2letters(thousands) + length(nums[1000]) return num2letters(thousands, dic) + length(dic[1000])
end end
end end
@ -50,10 +41,20 @@ function Problem17()
20 letters. The use of "and" when writing out numbers is in compliance 20 letters. The use of "and" when writing out numbers is in compliance
with British usage. with British usage.
=# =#
nums = Dict(
0 => "", 1 => "one", 2 => "two", 3 => "three", 4 => "four", 5 => "five",
6 => "six", 7 => "seven", 8 => "eight", 9 => "nine", 10 => "ten",
11 => "eleven", 12 => "twelve", 13 => "thirteen", 14 => "fourteen",
15 => "fifteen", 16 => "sixteen", 17 => "seventeen", 18 => "eighteen",
19 => "nineteen", 20 => "twenty", 30 => "thirty", 40 => "forty",
50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty",
90 => "ninety", 100 => "hundred", 1000 => "thousand"
)
n = 1000 n = 1000
letters = 0 letters = 0
for num in 1:n for num in 1:n
letters += num2letters(num) letters += num2letters(num, nums)
end end
return letters return letters
end end