From a3d628a6dde267b24e56b1926b8843fa704815ac Mon Sep 17 00:00:00 2001 From: Kohei Yasumura Date: Sun, 21 Oct 2012 15:09:22 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E3=83=A8=E3=83=AD=E3=82=B7=E3=82=AF=20work?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kohei_zev/mail.rb | 19 ++++++++ kohei_zev/map.txt | 11 +++++ kohei_zev/q1.rb | 116 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 kohei_zev/mail.rb create mode 100644 kohei_zev/map.txt create mode 100644 kohei_zev/q1.rb 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..57a50b0 --- /dev/null +++ b/kohei_zev/q1.rb @@ -0,0 +1,116 @@ +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" + +require "nkf" + +class NumberScanner + def initialize(source, transform_hash) + @source = source + @transform = transform_hash + @current_pos = 0 + @result = "" + p 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 + + +NumberScanner.new("テスト", transform) + + +n = NumberScanner.new("ヨロシク", transform) + +puts n.scan \ No newline at end of file From 562f4e8246f85bd43e2a91f3f3ada2ce39767d9a Mon Sep 17 00:00:00 2001 From: Kohei Yasumura Date: Sun, 21 Oct 2012 15:25:29 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E3=81=AA=E3=81=AA=E3=81=A4=E3=81=97?= =?UTF-8?q?=E3=81=8Fworks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kohei_zev/q1.rb | 149 ++++++++++++++++++++++--------------------- kohei_zev/q1_test.rb | 18 ++++++ 2 files changed, 95 insertions(+), 72 deletions(-) create mode 100644 kohei_zev/q1_test.rb diff --git a/kohei_zev/q1.rb b/kohei_zev/q1.rb index 57a50b0..c1949ef 100644 --- a/kohei_zev/q1.rb +++ b/kohei_zev/q1.rb @@ -1,74 +1,87 @@ -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" +#coding:utf-8 require "nkf" -class NumberScanner +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 = "" - p explode_source + explode_source end def to_katakana(s) @@ -95,7 +108,7 @@ def scan end def match(strs, pos, hitting_key = "") - puts "db : #{hitting_key} pos #{pos} strs #{strs}" + #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] @@ -106,11 +119,3 @@ def match(strs, pos, hitting_key = "") end end - - -NumberScanner.new("テスト", transform) - - -n = NumberScanner.new("ヨロシク", transform) - -puts n.scan \ No newline at end of file diff --git a/kohei_zev/q1_test.rb b/kohei_zev/q1_test.rb new file mode 100644 index 0000000..933a225 --- /dev/null +++ b/kohei_zev/q1_test.rb @@ -0,0 +1,18 @@ +#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("ななつしく") + end +end + + From 7e3b2825ee59adf35dccfa813355f74c67fc81ad Mon Sep 17 00:00:00 2001 From: Kohei Yasumura Date: Sun, 21 Oct 2012 15:35:00 +0900 Subject: [PATCH 3/3] last work --- kohei_zev/q1.rb | 2 +- kohei_zev/q1_test.rb | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/kohei_zev/q1.rb b/kohei_zev/q1.rb index c1949ef..0ce92f7 100644 --- a/kohei_zev/q1.rb +++ b/kohei_zev/q1.rb @@ -65,7 +65,7 @@ def self.convert(string) transform["コ"] = "9" transform["キュウ"] = "9" transform["ク"] = "9" - transform["ナイン"] = "9" + transform["キュー"] = "9" transform["トオ"] = "10" transform["ジュウ"] = "10" transform["ジ"] = "10" diff --git a/kohei_zev/q1_test.rb b/kohei_zev/q1_test.rb index 933a225..50d50f4 100644 --- a/kohei_zev/q1_test.rb +++ b/kohei_zev/q1_test.rb @@ -12,6 +12,17 @@ def test_raise_on_unmatchable 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