Michael Fellinger wrote:
> On Wed, Aug 27, 2008 at 9:57 AM, Todd Benson <caduceass / gmail.com> wrote:
>> On Tue, Aug 26, 2008 at 6:30 PM, danielj <sleepingindian / gmail.com> wrote:
>>> Also, would there be an easy way to print the words out instead of the
>>> numbers of bottles on the wall?
>> Divide the number by 10 and it will give the prefix (ninety-, eighty-,
>> etc.)  You need a list or hash of some sort, of course.  Simple
>> example...
>>
>> prefixes = {9 => "ninety-", 8 => "eighty-"}
>>
>> ...or even better...
>>
>> prefixes = ["", "", "twenty-", "thirty-", "forty-"]
>>
>> ...and so on.  And then modify the numbers ten through nineteen after
>> the transformation (you don't want "one" for "eleven" do you) since
>> they differ in nomenclature from the others.
>>
>> You could automagically use suffixes instead of prefixes if the
>> number, when divided  by 10 is 1, but that wouldn't help you with the
>> edge cases of 'ten', 'eleven', and 'twelve'.
> 
> http://p.ramaze.net/1900
> my stab at it
> 
> ^ manveru
> 

I did something slightly different, which works on multiple levels, not 
just two.  For example, it can go all the way up to 999 without any 
extra code.

#!/usr/bin/env ruby

class Fixnum
   ENGLISH = {
     0 => 'zero',
     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 => 'ninteen',

     20 => 'twenty',
     30 => 'thirty',
     40 => 'forty',
     50 => 'fifty',
     60 => 'sixty',
     70 => 'seventy',
     80 => 'eighty',
     90 => 'ninety',

     100 => 'one hundred and',
     200 => 'two hundred and',
     300 => 'three hundred and',
     400 => 'four hundred and',
     500 => 'five hundred and',
     600 => 'six hundred and',
     700 => 'seven hundred and',
     800 => 'eight hundred and',
     900 => 'nine hundred and'
   }

   def to_english
     i = ENGLISH.keys.select{|n| n <= self}.max
     ENGLISH[i] + (i < self ? " " + (self-i).to_english : '')
   end
end

99.downto(1) do|i|
   puts "#{i.to_english} bottles of beer on the wall"
end

-- 
Michael Morin
Guide to Ruby
http://ruby.about.com/
Become an About.com Guide:  beaguide.about.com
About.com is part of the New York Times Company