DevFestクイズ答案: 漢字変換マシン

なんかもうすっかり時期を逸した感じですが、せっかくなので、ほぼas-isで答案晒します。

動作環境

WebサーバとしてWebrickを直接使うのと大差ないとは思いますが、一応Sinatraを使っています。

require 'rubygems'
require 'sinatra'

# パス /devfest へのHTTP GET処理
get '/devfest' do
  input = params[:n].to_i
  content_type 'text/plain'
  convert(input)
end

# 数値→漢数字変換
# 兆/億/万の単位で区切り、各単位ごとに千以下の位を convert_sub で変換する。
def convert(input)
  output = ""

  cho = input / 1000000000000
  output_cho = convert_sub(cho)
  output << output_cho + 'X' if output_cho != ""

  oku = (input - cho*1000000000000) / 100000000
  output_oku = convert_sub(oku)
  output << output_oku + 'K' if output_oku != ""

  man = (input - cho*1000000000000 - oku*100000000) / 10000
  output_man = convert_sub(man)
  output << output_man + 'U' if output_man != ""

  zero = input - cho*1000000000000 - oku*100000000 - man*10000
  output << convert_sub(zero)

  # 入力が0である場合に限ってZ=零を出力
  if input == 0
    output = 'Z'
  end
  return output
end

# 千以下の位についての数値→漢数字変換
def convert_sub(input)
  number_map = {
  1 => 'R', 2 => 'D', 3 => 'M', 4 => 'B', 5 => 'L',
  6 => 'H', 7 => 'A', 8 => 'Y', 9 => 'P'}
  output = ""

  sen = input / 1000
  if sen >= 2
    output << number_map[sen] + 'E'
  elsif sen == 1
    output << 'E'
  end

  hyaku = (input - sen * 1000) / 100
  if hyaku >= 2
    output << number_map[hyaku] + 'J'
  elsif hyaku == 1
    output << 'J'
  end

  ju = (input - sen*1000 - hyaku*100) / 10
  if ju >= 2
    output << number_map[ju] + 'T'
  elsif ju == 1
    output << 'T'
  end

  ichi = input - sen*1000 - hyaku*100 - ju*10
  if ichi >= 1
    output << number_map[ichi]
  end
  return output
end