diff --git a/kohei_zev/mail.rb b/kohei_zev/mail.rb new file mode 100644 index 0000000..8118d06 --- /dev/null +++ b/kohei_zev/mail.rb @@ -0,0 +1,19 @@ +#open("map.txt") do |f| +# p f.read +#end +require "nkf" + +def to_katakana(s) + NKF.nkf("-w -h2", s) +end + +# boot strap hash table +puts "trasform = Hash.new {|h,k| h[k] = [] }" +transform = IO.readlines("map.txt").inject({}) do |hash, line| +d=line.split +val = d.first.strip +keys = d[1..-1].map {|k| k.strip.split("、") }.flatten +keys.each do |k| + puts "transform[\"#{to_katakana(k)}\"] = \"#{val}\"" +end +end \ No newline at end of file diff --git a/kohei_zev/map.txt b/kohei_zev/map.txt new file mode 100644 index 0000000..3d343d3 --- /dev/null +++ b/kohei_zev/map.txt @@ -0,0 +1,11 @@ +0 まる、ま れい、れ オウ、ゼロ、ゼ +1 ひとつ、ひと、ひ いち、い ワン +2 ふたつ、ふた、ふ に ツ +3 みつ、み さん、さ スリー +4 よん、よ、よつ し フォー +5 いつつ、いつ ご、こ ファイブ、ファイヴ +6 むつ、む ろく、ろ シックス +7 ななつ、なな、な しち セブン、セヴン +8 やつ、や はち、は、ば エート +9 ここのつ、こ きゅう、く ナイン +10 とお じゅう、じ テン \ No newline at end of file diff --git a/kohei_zev/q1.rb b/kohei_zev/q1.rb new file mode 100644 index 0000000..0ce92f7 --- /dev/null +++ b/kohei_zev/q1.rb @@ -0,0 +1,121 @@ +#coding:utf-8 + +require "nkf" + +class KanaToNumber + + def self.convert(string) + Scanner.new(string, @transform).scan + end + + # Big tranformation table + transform = Hash.new # {|h,k| h[k] = [] } + transform["マル"] = "0" + transform["マ"] = "0" + transform["レイ"] = "0" + transform["レ"] = "0" + transform["オウ"] = "0" + transform["ゼロ"] = "0" + transform["ゼ"] = "0" + transform["ヒトツ"] = "1" + transform["ヒト"] = "1" + transform["ヒ"] = "1" + transform["イチ"] = "1" + transform["イ"] = "1" + transform["ワン"] = "1" + transform["フタツ"] = "2" + transform["フタ"] = "2" + transform["フ"] = "2" + transform["ニ"] = "2" + transform["ツ"] = "2" + transform["ミツ"] = "3" + transform["ミ"] = "3" + transform["サン"] = "3" + transform["サ"] = "3" + transform["スリー"] = "3" + transform["ヨン"] = "4" + transform["ヨ"] = "4" + transform["ヨツ"] = "4" + transform["シ"] = "4" + transform["フォー"] = "4" + transform["イツツ"] = "5" + transform["イツ"] = "5" + transform["ゴ"] = "5" + transform["コ"] = "5" + transform["ファイブ"] = "5" + transform["ファイヴ"] = "5" + transform["ムツ"] = "6" + transform["ム"] = "6" + transform["ロク"] = "6" + transform["ロ"] = "6" + transform["シックス"] = "6" + transform["ナナツ"] = "7" + transform["ナナ"] = "7" + transform["ナ"] = "7" + transform["シチ"] = "7" + transform["セブン"] = "7" + transform["セヴン"] = "7" + transform["ヤツ"] = "8" + transform["ヤ"] = "8" + transform["ハチ"] = "8" + transform["ハ"] = "8" + transform["バ"] = "8" + transform["エート"] = "8" + transform["ココノツ"] = "9" + transform["コ"] = "9" + transform["キュウ"] = "9" + transform["ク"] = "9" + transform["キュー"] = "9" + transform["トオ"] = "10" + transform["ジュウ"] = "10" + transform["ジ"] = "10" + transform["テン"] = "10" + @transform = transform + +end + +class Scanner + + def initialize(source, transform_hash) + @source = source + @transform = transform_hash + @current_pos = 0 + @result = "" + explode_source + end + + def to_katakana(s) + NKF.nkf("-w -h2", s) + end + + def explode_source + @source_array = to_katakana(@source).split(//) + end + + def scan + @current_pos = 0 + + while @current_pos < @source_array.size + r, npos = match(@source_array, @current_pos) + if r.nil? + raise "No match for #{@source} at pos #{@current_pos}" + end + @result<< r + @current_pos = npos + end + + @result + end + + def match(strs, pos, hitting_key = "") + #puts "db : #{hitting_key} pos #{pos} strs #{strs}" + return [@transform[hitting_key], pos] if pos >= strs.size + k = hitting_key + strs[pos] + if @transform[k] + match(strs, pos + 1, k) + else + [@transform[hitting_key], pos] + end + end + +end diff --git a/kohei_zev/q1_test.rb b/kohei_zev/q1_test.rb new file mode 100644 index 0000000..50d50f4 --- /dev/null +++ b/kohei_zev/q1_test.rb @@ -0,0 +1,29 @@ +#coding:utf-8 + +require_relative "q1" +require "minitest/autorun" + +class TestQ1 < MiniTest::Unit::TestCase + def test_raise_on_unmatchable + assert_raises(RuntimeError) do + KanaToNumber.convert("テスト") + end + end + + def test_good_one + assert_equal "749",KanaToNumber.convert("ななつしく") + assert_equal "889",KanaToNumber.convert("ハヤク") + assert_equal "758",KanaToNumber.convert("ナゴヤ") + assert_equal "931",KanaToNumber.convert("クサイ") + assert_equal "315",KanaToNumber.convert("サイゴ") + end + + def test_harder + assert_equal "18782",KanaToNumber.convert("イヤナヤツ") + end + def test_harder_more + assert_equal "39",KanaToNumber.convert("サンキュー") + end +end + +