いしばいしはら課題
かな表記の配列を五十音順に整列する課題って、ちょっとした日本版 FizzBuzz 課題っぽくていいなと思いました。
どういう課題なのか?
「聴く日経<総合版>」2008.9.22放送分で、アナウンサーの人が、ちょっとぎこちない形で「いしば、いしはら...」とおっしゃっていました。
これは、五十音順の重箱の隅が発動されています。
五十音順について確認し、%w{いしはら いしば} を正しい五十音順に並び替えるプログラムを作成しなさい。
取り急ぎの回答案
「良い課題だなあ」とだけ漫然と言っていても恥ずかしいので、回答案を作ってみました。
まず、五十音順の定義を http://ja.wikipedia.org/wiki/%E4%BA%94%E5%8D%81%E9%9F%B3%E9%A0%86 あたりで調べました。
Google を使って、[ruby-list:18345] http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/18345 を発見。巨人の肩に乗ることにして、これをそのまま頂くことにしますが、Array#filter は廃止されているので、これを Array#collect! に書き換えます。
次が私の回答案になります:
$KCODE = 'u' require "jcode" class Array def vowel(c) case c when /[あかさたなはまやらわ]/; 'あ' when /[いきしちにひみゐり]/; 'い' when /[うくすつぬふむゆる]/; 'う' when /[えけせてねへめゑれ]/; 'え' when /[おこそとのほもよろを]/; 'お' else; 'ー' end end def jlex(str) str.tr(<<FM.chop, <<TO.chop).gsub(/(.)ー/){$1 + vowel($1)} ァアィイゥウェエォオカガキギクグケゲコゴ\ サザシジスズセゼソゾタダチヂッツヅテデトド\ ナニヌネノハバパヒビピフブプヘベペホボポ\ マミムメモャヤュユョヨラリルレロヮワヰヱヲンヴ\ ぁぃぅぇぉがぎぐげござじずぜぞだぢっづでど\ ばぱびぴぶぷべぺぼぽゃゅょゎゐゑ FM ああいいううええおおかかききくくけけここ\ ささししすすせせそそたたちちつつつててとと\ なにぬねのはははひひひふふふへへへほほほ\ まみむめもややゆゆよよらりるれろわわいえをんう\ あいうえおかきくけこさしすせそたちつつてと\ ははひひふふへへほほやゆよわいえ TO end private :vowel, :jlex def jsort! collect!{|e| [jlex(e), e]}.sort!.collect!{|e| e.pop} end def jsort dup.jsort! end end %w{えー えあ えお いしば いしはら}.jsort.each {|v| print v, "\n"} print "\n" %w{えー えあ えお いしば いしはら}.sort.each {|v| print v, "\n"}
出力は次のようになり、想定しているような結果になっているようです。
$ ruby ishi.rb いしば いしはら えあ えー えお いしはら いしば えあ えお えー