I overrode the Fixnum class, and there’s a teensy bit of recursion going on, but over all it was really simple. The hardest part was writing out all the unique numbers for my word hash.
If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?
words = {
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"
}
class Fixnum
def to_english words
str = ""
if self >= 100
str = "#{words[(self / 100)]}hundred"
if self % 100 > 0
str = "#{str}and#{(self % 100).to_english(words)}"
end
elsif self > 20
str = '#{words[(self / 10) * 10]}#{words[ self % 10 ]}'
elsif self == 1000
str = 'onethousand'
else
str = words[self]
end
str
end
end
total = 0
(1..1000).each do |i|
total += i.to_english(words).size
end
puts total