Tuesday, March 02, 2010

自分の無能さを晒す 1 Google Dev Fest 2010 の Quiz 漢字変換サーバ版

あー,自分でWebサーバ持っていないし,GAEにアプリ登録したこともないから,この問題にはチャレンジできないなと思っていましたが,回答締切6時間前に,別に自分で簡易ウェブサーバ立ちあげればいいんじゃないと思い,急遽やってみました。
幸いなことに,EmacsをChrome上で利用するためにWEBrickを利用したHTTPサーバのスクリプトを読んだこと(ChromeとEmacsを愛するもの達へ 【編集あり】)を思いだしたのが幸いでした。

方針は,

  • 特殊ケース 0 の場合は 零(H) を返す
  • 兆の位の4桁,億の位の4桁,万の位の4桁,一の位?の4桁を抽出して,漢数字に変換する。0や1千の扱い時に注意する。
です。
def trans_4digit_kansuzi(num)
  digit_1st_array = ['', 'G', 'B', 'S', 'A', 'Q', 'Z', 'P', 'C', 'Y'] # 零 一 二 三 四 五 六 七 八 九
  digit_other_array = ['', '', 'B', 'S', 'A', 'Q', 'Z', 'P', 'C', 'Y'] # 零 一 二 三 四 五 六 七 八 九
  unit_array = ['N', 'M', 'J', ''] # 千 百 十 零

  is_top_digit_zero = true
  ret_str = ""
  for i in 0 .. unit_array.size - 1
    tmp_num = (num % (10 ** (unit_array.size - i))) / (10 ** (unit_array.size - 1 -i))
    if tmp_num > 0 || is_top_digit_zero == false
      is_top_digit_zero = false
      if tmp_num != 0
        if i == (unit_array.size - 1)
          ret_str += (digit_1st_array[tmp_num] + unit_array[i])
        else
          ret_str += (digit_other_array[tmp_num] + unit_array[i])
        end
      end
    end
  end

  return ret_str
end

def trans_kansuzi(num)
  if num == 0
    return 'H' # 零
  end

  unit_array = ['T', 'D', 'K', ''] # 兆 億 万 零 

  ret_str = ""
  is_top_digit_zero = true
  for i in 0 .. unit_array.size - 1
    tmp_num = (num % (10000 ** (unit_array.size - i))) / (10000 ** (unit_array.size - 1 - i))
    debug_str = i.to_s + " " + tmp_num.to_s
    p debug_str
    if tmp_num > 0 || is_top_digit_zero == false
      is_top_digit_zero = false
      if tmp_num != 0
        ret_str += (trans_4digit_kansuzi(tmp_num) + unit_array[i])
      end
    end
  end
  return ret_str
end

p trans_kansuzi(ARGV[0].to_i)
本当は
tmp_num = (num % (10000 ** (unit_array.size - i))) / (10000 ** (unit_array.size - 1 - i))
のように上位桁から検証してしまったが,
tmp_num = num % 10000 # 下4桁の値を得る
# tmp_num 文字列生成処理
num = num / (10000 ** i) # 右4桁移動する。
のように,下位桁から検証した方が綺麗。(テストはしていない)

No comments: