著作一覧 |
以前、どこかで漢数字からアラビア数字へ変換するという問題を見かけたが、実際に必要になって書いてみたら実に気に食わない。あのとき、ちゃんとうまい解答例を見ておけばよかった。
ここでやりたいのは単純で、一~五十くらいまでで、十一とか三十一とかの表記となる。これを1~50、11とか31とかに直す。
最初こう書いた。
KINDEX = "十一二三四五六七八九" ARABIC = "0123456789" def kj_to_arabic(s) r = '' s.each_char do |c| r << ARABIC[KINDEX.index(c)] end if r =~ /¥A0(¥d)¥Z/ "1#{$1}" elsif r == '0' '10' else r.gsub(/0(¥d)¥Z/, '¥1') end end
たかがこんなことに//が2回も出てくるのも気に食わないし、なんか不細工だ。
そこで次に//を使わずにこう書いてみた。
KINDEX = "十一二三四五六七八九" ARABIC1 = ['10', '1', '2', '3', '4', '5', '6', '7', '8', '9'] ARABIC2 = ['1', '1', '2', '3', '4', '5', '6', '7', '8', '9'] ARABIC3 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] ARABIC4 = ['', '1', '2', '3', '4', '5', '6', '7', '8', '9'] def kj_to_arabic(s) case s.size when 1 ARABIC1[KINDEX.index(s)] when 2 ARABIC2[KINDEX.index(s[0])] + ARABIC3[KINDEX.index(s[1])] else r = '' s.each_char do |c| r << ARABIC4[KINDEX.index(c)] end r end end
最初のよりはましな気もするが、あまりにもアドホックに過ぎる。(追記:3文字なら2文字目は無視すればいいな。)
というわけで、よりスマートに書くにはどうすれば良いのだろう?
ジェズイットを見習え |
以前ゴルフ場で出されました。まあ、ゴルフなので参考になるかどうか。<br>http://golf.shinh.org/p.rb?Japanese+numeral+for+Ruby+kaigi#Ruby
ありがとうございます。ゴルフだったのか。見てみます。