After hearing about Ben’s motivation trouble with problem 17, I realized that I only had fun on that problem because I saw a rather fun algorithm. Since I’m rather proud of it, I’m going to show off the code here.
ones = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
tens = ["", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]
hundred = "hundred"
and_ = "and"
thousand = "thousand"
sum = ""
1.upto(1000) do |i|
curr = i
out = ""
if (curr > 999) then
out += ones[curr/1000] + thousand
curr = curr%1000
end
if (curr > 99) then
out += ones[curr/100] + hundred
curr = curr%100
out += and_ if curr != 0
end
if (curr >= 20) then
out += tens[curr/10]
curr = curr%10
out += ones[curr]
else
out += ones[curr]
end
sum += out
end
puts sum.length
# Over 50 trials:
# Mean: 17.3689 ms
# Median: 16.5885 ms
I’m particularly proud of this code because I don’t have to convert the numbers into an array, and it’s blazing fast, even in ruby.

You see that. I knew there were more clever and elegant solutions than what I hacked together. Nicely done.