NabeAtzzを今更ながらやってみた

fizzbuzzをやってみた - うんたらかんたらRuby - Rubyist
で思い出したので、↓をやってみた。
そろそろ FizzBuzz に飽きた - にぽたん研究所

やってみた

#!/usr/bin/ruby -Ku
def nabeatzz(num)
  if num % 3 == 0 || /3/ =~ num.to_s
    num_to_japanese(num)
  else
    num
  end
end


def num_to_japanese(num)
  rtn = ""
  #変換文字列
  figures = ["","いち","","さん","よん","","ろく","なな","はち", "きゅう"]
  units   = ["まん","せん","ひゃく","じゅう",""] 

  #units配列のどの位置から使用するかを桁数から算出
  unit_start_index = units.size - num.to_s.length
  
  #数値を日本語に変換
  num.to_s.scan(/./).each_with_index do |n, i|
    # "1"でない または 最後の1桁でない場合のみ変換
    #if n != "1" バグ修正コメント参照
    if n != "1" || num.to_s.length == i + 1
      rtn << figures[n.to_i]
    end
    #単位を追記
    if n != "0"
      rtn << units[unit_start_index + i]
    end
  end
  rtn
end

(1..100).each {|i| puts nabeatzz(i)}
#(100..1000).each {|i| puts nabeatzz(i)}
#(1000..10000).each {|i| puts nabeatzz(i)}

結果

1
2
さん
4
5
ろく
7
8
きゅう
10
11
じゅうに
じゅうさん
14
じゅうご
16
17
じゅうはち
19
20
にじゅういち
22
にじゅうさん
にじゅうよん
25
26
にじゅうなな
28
29
さんじゅう
さんじゅういち
さんじゅうに
さんじゅうさん
さんじゅうよん
さんじゅうご
さんじゅうろく
さんじゅうなな
さんじゅうはち
さんじゅうきゅう
40

以下略

figures/units配列に空白値をもたせることでif分岐が減って、ちょっとすっきりしました。
300代、3000代は「びゃく」「ぜん」に変換しないといけないけど、まぁええか。
to_s.scanした後to_iするのが、なんかいや。