Rubyで数字をローマ数字で表示

自分でも解いてみる。

class Integer
 def roman(s=self)
  return "-" if 3999 < s
  
  v = 1
  r = {1 => 'I', 4 => 'IV', 5 => 'V', 9=> 'IX', 10 =>  'X',
   40 => 'XL', 50 => 'L', 90 => 'XC', 100 => 'C', 400 => 'CD',
   500 => 'D', 900=> 'CM', 1000 => 'M', 9999 => "" }
  
  r.keys.sort.each{|k|
   if k > s && s > 0
    return r[v] + roman(s - v); break
   end
   v = k }
  return ""
 end
end

# test
[ 1,2,3,4,5,6,7,8,9,10,
 11,12,13,14,15,16,17,18,19,20,
 95,96,97,98,99,100,200,450,500,
 999,1000,1945,1999,3999,4000 ].each{|v| puts v.to_s + "\t" + v.roman }

とりあえず、答えはあってるっぽい。
・・・一文字のI V X などと同様に、事前にIV,IXといった減算タイプもハッシュに用意しちゃう方法。
どんなもんでしょ。