Hatena::Grouprubyist

うんたらかんたらRuby RSSフィード

2008-12-02NabeAtzzを今更ながらやってみた

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

| NabeAtzzを今更ながらやってみた - うんたらかんたらRuby を含むブックマーク はてなブックマーク - NabeAtzzを今更ながらやってみた - うんたらかんたらRuby

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するのが、なんかいや。

rochefortrochefort2008/12/01 23:33あ、今日流行語大賞発表だったんですね。受賞逃したのか。
でも、なんかタイムリー。

rochefortrochefort2008/12/02 22:11バグっとるやんけ。
ということで2点修正。

1点目:最後の一桁が1の場合、変換されていないバグ
    31→さんじゅう になっていたのを修正。
2点目:2桁目以上が0の場合、不要な単位(ひゃく、じゅう)が付与されていたバグ
    102→ひゃくにじゅうに になっていたのを修正。

トラックバック - http://rubyist.g.hatena.ne.jp/rochefort/20081202