いしばいしはら課題

かな表記の配列を五十音順に整列する課題って、ちょっとした日本版 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 
いしば
いしはら
えあ
えー
えお

いしはら
いしば
えあ
えお
えー