sin5のRuby勉強日記 このページをアンテナに追加 RSSフィード

2006-07-11

[]12_1漢数字を数字に変換するメソッド 12_1漢数字を数字に変換するメソッド - sin5のRuby勉強日記 を含むブックマーク はてなブックマーク - 12_1漢数字を数字に変換するメソッド - sin5のRuby勉強日記 12_1漢数字を数字に変換するメソッド - sin5のRuby勉強日記 のブックマークコメント

最初に

ひさしぶりに挑戦

問題

"七千百二十三"といった、漢数字による数の表現を、「7123」のような数値に変換するメソッドkan2numを定義してください

解答

require 'test/unit'
class Kan2NumTest < Test::Unit::TestCase
  def setup
    @arg = %w|十五 百二十三 千五百四十六 百五十六万八千八百四十一 千二百三十五億六千八百七十三万千七百八十三|
    @result = [15, 123, 1546, 1568841, 123568731783]
  end

  def test_kan2num
    while arg = @arg.shift
      assert_equal kan2num(arg), @result.shift
    end
  end
end

def kan2num kan
  nums = %w|〇 一 二 三 四 五 六 七 八 九|
  digits =  %w|十 百 千|
  digits2 = %w|万 億 兆|

  pieces = kan.split(//e)
  stack = 0
  sum = 0
  result = 0
  while kan = pieces.shift
    if i = nums.index(kan)
      stack = i
    elsif i = digits.index(kan)
      stack = 1 if stack == 0
      sum += stack * (10 ** (i + 1))
      stack = 0
    elsif i = digits2.index(kan)
      result += (sum + stack) * ( 10 ** ((i + 1) * 4))
      sum = 0
      stack = 0
    end
  end
  result += sum + stack
end

実行結果

Loaded suite 12-1
Started
.
Finished in 0.003151 seconds.

1 tests, 5 assertions, 0 failures, 0 errors

コメント

結構時間かかった。

多分カナリキタナイ…

なんだよstack,sum,resultって…

digit,digit2ひでぇwwww

0から9の数字と

十,百,千と

それ以上の桁を分けるって考えをすぐに思いついたんだけど…

実装はショボーン。

ってか他のアプローチの方が素直にいけたりするのかもしれないなぁ…思いつかないけど。

今日はもう疲れたので今度にしますが、他の人の回答も絶対読もう。

添削なりアドバイスなりあればしてもらえると感動します。

トラックバック - http://rubyist.g.hatena.ne.jp/sin5/20060711