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
=#
function num2letters(num)
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"
)
function num2letters(num, dic)
if num <= 20
return length(nums[num])
return length(dic[num])
elseif num < 100
tens, units = divrem(num, 10)
return length(nums[tens * 10]) + num2letters(units)
return length(dic[tens * 10]) + num2letters(units, dic)
elseif num < 1000
hundreds, rest = divrem(num, 100)
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
return num2letters(hundreds) + length(nums[100])
return num2letters(hundreds, dic) + length(dic[100])
end
else
thousands, rest = divrem(num, 1000)
return num2letters(thousands) + length(nums[1000])
return num2letters(thousands, dic) + length(dic[1000])
end
end
@ -50,10 +41,20 @@ function Problem17()
20 letters. The use of "and" when writing out numbers is in compliance
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
letters = 0
for num in 1:n
letters += num2letters(num)
letters += num2letters(num, nums)
end
return letters
end