From: William James Date: 2006-12-10T01:50:06+09:00 Subject: Re: Need help on a program Christopher Latif wrote: > Stuck on this exercise from a book: > Old-school Roman numerals. In the early days of Roman numerals, > the Romans didn't bother with any of this new-fangled subtraction > "IX" nonsense. No sir, it was straight addition, biggest to littlest- > so 9 was written "VIIII," and so on. Write a method that, when > passed an integer between 1 and 3000 (or so), returns a string > containing the proper old-school Roman numeral. In other words, > old_roman_numeral 4 should return 'IIII'. Make sure to test > your method on a bunch of different numbers. > For reference, these are the values of the letters used: > I =1 V =5 X = 10 L = 50 > C = 100 D = 500 M = 1000 > > Suggestions on a soloution? > > -- > Posted via http://www.ruby-forum.com/. class Integer def to_roman "I =1 V =5 X = 10 L = 50 C = 100 D = 500 M = 1000". scan( / ([A-Z]) \s *= \s* (\d+) /x ). map{|letter,val| [ letter, val.to_i ] }. sort_by{|a| -a.last}. inject( [ "", self ] ){|roman, pair| [ roman.first + pair.first * (roman.last / pair.last), roman.last % pair.last ] }. first end end