作者: 藤岡和夫
日時: 2008/7/06(14:17)
清と濁
http://mumrik.air-nifty.com/blog/2008/07/06_freelysort.html

にて、下記スクリプトについてMaukie!さんのコメントが出た。

Ruby 1.9.0ではエラーになる。

On Sat, 28 Jun 2008 13:41:02 +0900
藤岡和夫 <kazuf@...> wrote:

> -----^
> chars = "い,ろ,は,に,ほ,へ,と,ち,り,ぬ,る,を,わ,か,よ,た,れ,そ,つ,ね,な,ら,む,う,ゐ,の,お,く,や,ま,け,ふ,こ,え,て,あ,さ,き,ゆ,め,み,し,ゑ,ひ,も,せ,す,ん"
> tbl = chars.split(/,/)
> j = 0
> char = Hash.new
> for i in 0..(tbl.length - 1) do
> 	j += 1
> 	char[tbl[i]] = j
> end
> numstr = ""
> words = Hash.new
> while line = DATA.gets
> 	wchars = line.chomp.split(//)
> 	p wchars.length
> 	for k in 0 .. (wchars.length - 1) do
> 		numstr += sprintf("%02d", char[wchars[k]])
> 	end
> 	words[numstr] = line
> 	numstr = ""
> end
> words.keys.sort.each{|numstr| print "#{numstr} #{words[numstr]}"}
> __END__
> いぬ
> とちのき
> にんじん
> はむたろう
> ろば
> へらぶな
> とり
> ほらがい
> -----$

 問題は、文字辞書配列にない文字が文字列にあるとsprintfがnilをIntegerに
変換できないというエラーを出すことである。

 スクリプトの問題というよりは、辞書の不備の問題であるので、辞書を書き直
した。辞書にない文字は、濁音・半濁音なので清音の後に並べた。

 しかし、辞書が完璧にならない場合に備えて、Yささん仕様にあわせて、辞書
にない文字には、辞書サイズ+1の数値を与えることにした。

-----^
tbl = "いろはばぱにほぼぽへべぺとどちぢりぬるをわかがよただれそぞつづねならむうゐのおくぐやまけげふぶぷこごえてであさざきぎゆめみしじゑひびぴもせぜすずん".split(//)
j = 0
char = Hash.new
for i in 0..(tbl.length - 1) do
	j += 1
	char[tbl[i]] = j
end
numstr = ""
words = Hash.new
while line = DATA.gets
	wchars = line.chomp.split(//)
	p wchars.length
	for k in 0 .. (wchars.length - 1) do
		if char[wchars[k]]
			numstr += sprintf("%02d", char[wchars[k]])
		else
			numstr += sprintf("%02d", tbl.length + 1)
		end
	end
	words[numstr] = line
	numstr = ""
end
words.keys.sort.each{|numstr| print "#{numstr} #{words[numstr]}"}
__END__
いぬ
とちのき
にんじん畑
はむたろう
ろば
へらぶな
とり
ほらがい
-----$

藤岡 和夫
kazuf@...
日曜プログラマのひとりごと http://homepage1.nifty.com/kazuf/renewal.html