UNIX 系 OS 上で動く Windows API の実装。 約 2 週間ぶりの version up。
美しいペン習字風 font。
「IT Text 音声認識システム」の付録 CD-ROM に入っている chawan という プログラムの代替をちょこちょこと作成中。
#! /usr/bin/env ruby
# 数字から位取りした読み情報を生成するクラス class CreateJapaneseNumbers JAPANESE_LOWER_ZERO = ['0', 'レイ', '{レイ/ゼロ}'] JAPANESE_LOWER_NUMBERS = [# 各数字の「表記」「読み」「基本発音」を提供。 # 一の位 [[], ['1', 'イチ', 'イチ'], ['2', 'ニ', 'ニ'], ['3', 'サン', 'サン'], ['4', 'ヨン', 'ヨン'], ['5', 'ゴ', 'ゴ'], ['6', 'ロク', 'ロク'], ['7', 'ナナ', '{ナナ/シチ}'], ['8', 'ハチ', 'ハチ'], ['9', 'キュウ', 'キュー']], # 十の位 [[], ['十', 'ジュウ', 'ジュー'], ['2十', 'ニジュウ', 'ニジュー'], ['3十', 'サンジュウ', 'サンジュー'], ['4十', 'ヨンジュウ', 'ヨンジュー'], ['5十', 'ゴジュウ', 'ゴジュー'], ['6十', 'ロクジュウ', 'ロクジュー'], ['7十', 'ナナジュウ', 'ナナジュー'], ['8十', 'ハチジュウ', 'ハチジュー'], ['9十', 'キュウジュウ', 'キュージュー']], # 百の位 [[], ['百', 'ヒャク', 'ヒャク'], ['2百', 'ニヒャク', 'ニヒャク'], ['3百', 'サンビャク', 'サンビャク'], ['4百', 'ヨンヒャク', 'ヨンヒャク'], ['5百', 'ゴヒャク', 'ゴヒャク'], ['6百', 'ロッピャク', 'ロッピャク'], ['7百', 'ナナヒャク', 'ナナヒャク'], ['8百', 'ハッピャク', 'ハッピャク'], ['9百', 'キュウヒャク', 'キューヒャク']], # 千の位 [[], ['千', 'セン', '{セン/イッセン}'], ['2千', 'ニセン', 'ニセン'], ['3千', 'サンゼン', 'サンゼン'], ['4千', 'ヨンセン', 'ヨンセン'], ['5千', 'ゴセン', 'ゴセン'], ['6千', 'ロクセン', 'ロクセン'], ['7千', 'ナナセン', 'ナナセン'], ['8千', 'ハッセン', 'ハッセン'], ['9千', 'キュウセン', 'キューセン']] ] JAPANESE_UPPER_NUMBERS = [# 各位の「表記」「読み」「基本発音」を提供。 nil, ['万', 'マン', 'マン'], ['億', 'オク', 'オク'], ['兆', 'チョウ', 'チョウ'], ['京', 'ケイ', 'ケイ'], ['垓', 'ガイ', 'ガイ'] ] JAPANESE_LOWER_REPLACE_RULE = [# 各数字の「発音変化」を提供。 # 一〜千 [[/\Aヨン\z/, '{ヨン/シ}']], # 万 [], # 億 [], # 兆 [[/\Aイチ\z/, 'イッ'], [/\Aハチ\z/, 'ハッ'], [/ジュー\z/, '{ジュッ/ジッ}'], [/(((ヒ|ビ|ピ)ャ)ク)\z/, '{\1/\2ッ}']], # 京 [[/\Aイチ\z/, '{イチ/イッ}'], [/\Aハチ\z/, '{ハチ/ハッ}'], [/ジュー\z/, '{ジュッ/ジッ}'], [/(((ヒ|ビ|ピ)ャ)ク)\z/, '{\1/\2ッ}']], # 垓 [[/ジュー\z/, '{ジュッ/ジッ}'], [/(((ヒ|ビ|ピ)ャ)ク)\z/, '{\1/\2ッ}']] ] def initialize @output = Array::new end def create_jnumbers(number, values=nil) @output.clear number = number.to_s.split(//) place = number.length inserted_lower_number = false number.each { |n| place = place - 1 lower_index = place % 4 lower_number = JAPANESE_LOWER_NUMBERS[lower_index][n.to_i] unless lower_number.empty? then @output << lower_number inserted_lower_number = true end if lower_index == 0 and inserted_lower_number then inserted_lower_number = false lower_number = @output.pop if lower_number then lower_number = lower_number.dup lower_number[2] = lower_number[2].dup JAPANESE_LOWER_REPLACE_RULE[ place / 4 ].each { |rule| break if lower_number[2].sub!(rule[0], rule[1]) } @output << lower_number end if 0 < place then @output << JAPANESE_UPPER_NUMBERS[ place / 4 ] end end } if @output.empty? then @output << JAPANESE_LOWER_ZERO end if values then return values.replace(@output) else return @output.dup end end end
# 主処理 (動作確認サンプル) values = Array::new cjn = CreateJapaneseNumbers::new ARGV.each { |number| if /\A[0-9]+\z/ =~ number then puts "#{number}:" number = number.to_i cjn.create_jnumbers(number, values) values.each { |n| puts "\t#{n[0]}\t#{n[1]}\t#{n[2]}" } else warn "WARNING: \"#{number}\" is invalid!" end }
12345678901234567890
を引数に与えると、以下の出力を得る。
千 セン {セン/イッセン} 2百 ニヒャク ニヒャク 3十 サンジュウ サンジュー 4 ヨン ヨン 京 ケイ ケイ 5千 ゴセン ゴセン 6百 ロッピャク ロッピャク 7十 ナナジュウ ナナジュー 8 ハチ ハッ 兆 チョウ チョウ 9千 キュウセン キューセン 十 ジュウ ジュー 2 ニ ニ 億 オク オク 3千 サンゼン サンゼン 4百 ヨンヒャク ヨンヒャク 5十 ゴジュウ ゴジュー 6 ロク ロク 万 マン マン 7千 ナナセン ナナセン 8百 ハッピャク ハッピャク 9十 キュウジュウ キュージュー
連続して使うとボロが出るところを、とりあえず修正した。