module IkaConjugations U_VOWEL_CHANGES = { "る" => { "a" => "ら", "i" => "り", "u" => "る", "e" => "れ", "o" => "ろ" }, "う" => { "a" => "あ", "i" => "い", "u" => "う", "e" => "え", "o" => "お" }, "つ" => { "a" => "た", "i" => "ち", "u" => "つ", "e" => "て", "o" => "と" }, "す" => { "a" => "さ", "i" => "し", "u" => "す", "e" => "せ", "o" => "そ" }, "く" => { "a" => "か", "i" => "き", "u" => "く", "e" => "け", "o" => "こ" }, "ぐ" => { "a" => "が", "i" => "ぎ", "u" => "ぐ", "e" => "げ", "o" => "ご" }, "ぶ" => { "a" => "ば", "i" => "び", "u" => "ぶ", "e" => "べ", "o" => "ぼ" }, "む" => { "a" => "ま", "i" => "み", "u" => "む", "e" => "め", "o" => "も" }, "ぬ" => { "a" => "な", "i" => "に", "u" => "ぬ", "e" => "ね", "o" => "の" }, } class KanaKanji attr_reader :kana, :kanji def initialize(kana, kanji=nil) @kana = kana @kanji = kanji || kana end def [](index) self.class.new kana[index], kanji[index] end def +(other) case other when String self.class.new kana + other, kanji + other when KanaKanji self.class.new kana + other.kana, kanji + other.kanji end end def last_character(new_form=nil) return kana[-1] unless new_form U_VOWEL_CHANGES[kana[-1]][new_form] end def all_but_last_character self.class.new kana[0...-1], kanji[0...-1] end end end