Liczby arabskie<=>rzymskie

poszukuję snippetu/gema/pluginu/whatever do konwersji liczb arabskich do rzymskich(i ew. na odwrót).
Zassałem gema english - jednak nie dość, że odwołują się oni w przykładzie do metody która nie istnieje(jednak to przebolałem - znalazłem sobie prawidłową nazwę metody ( to_s_roman lub to_i_roman) ) jednak gdy pierwszy mój test ( 9.to_s_roman # => VIIII ) dał taki rezultat, stwierdziłem, że szkoda na nią czasu. szukałem innych rozwiązań, jednak poza jednym wątkiem na forum (z którego ściągnąłem ten rozwlekły kawałek kodu, i stwierdziłem że też nei działa) nie znalazłem nic interesującego -a nie wierzę, że nikt do tej pory nie napisał poprawnie działającego kawałka kodu, który zamienia liczby na rzymskie.
Byłbym bardzo wdzięczny za wszleką pomoc

[quote=krzyzak][…]a nie wierzę, że nikt do tej pory nie napisał poprawnie działającego kawałka kodu, który zamienia liczby na rzymskie.
Byłbym bardzo wdzięczny za wszleką pomoc[/quote]
I masz rację - chyba każdy pisał dla rozgrzewki coś w tym stylu, gdy był jeszcze piękny i młody;) Tu masz mojego gniota z przeszłości, który się gdzieś jeszcze zachował i akurat pasuje jako rozwiązanie połowy Twojego problemu;)

[code]#!/usr/bin/env ruby
WELCOME = “\nInteger into Roman conversion.\nInput Integer:” # welcome banner
PROMPT = {:in => '> ', :out => '=> ', :error => '>> ’ } # pretty prompt
EXIT = %w[exit quit x q] # many/ruby;) ways to finish
BYE = “Bye.”

ROMAN = {‘I’ => 1, # all native Roman symbols plus extra doubles for easier life
‘IV’ => 4,
‘V’ => 5,
‘IX’ => 9,
‘X’ => 10,
‘XL’ => 40,
‘L’ => 50,
‘XC’ => 90,
‘C’ => 100,
‘CD’ => 400,
‘D’ => 500,
‘CM’ => 900,
‘M’ => 1000}

ROMAN_RANGE = 1…3999 # native Roman numbers range
ARG_ERROR = “Input is not an Integer or is out of range: #{ROMAN_RANGE}”

class Integer

Converts integer into Roman number format string

def to_roman
raise ArgumentError, ARG_ERROR if not self.can_be_roman?
response = ‘’
number = self
roman = ROMAN.invert
roman.keys.sort.reverse.each do |key|
counter, number = number.divmod(key)
counter.times {response << roman[key]}
end
response
end

Checks if integer is in the range of Roman numbers

def can_be_roman?
ROMAN_RANGE.member?(self)
end

end

if run in interactive mode

if FILE == $0
puts WELCOME
print PROMPT[:in]
at_exit {puts BYE}
while input = gets.chomp
exit if EXIT.include?(input)
begin
puts PROMPT[:out] + input.to_i.to_roman
rescue ArgumentError
puts PROMPT[:error] + $!
ensure
print PROMPT[:in]
end
end
end[/code]

Roman Numerals - Ruby Quiz