はじめに
『プロを目指す人のためのRuby入門』通称チェリー本を学習後のプログラミング初心者です。
インプットしたものを手を動かして実践してみたいなと思ったら、作者の記事を見つけました。
「アウトプットのネタに困ったらこれ!?Ruby初心者向けのプログラミング問題を集めてみた(全10問)」
この5つ目の問題を解いてみました。
他の問題はこちら
一問目:カレンダー作成問題(たのしいRuby 練習問題)
二問目:カラオケマシン作成問題
三問目:ビンゴカード作成問題
四問目:ボーナスドリンク問題
問題
カタカナ文字列の配列を渡すと、ア段の音別にグループ分けした配列を返すプログラムを作成せよ。
各要素は50音順にソートもすること。
例
# INPUT
['キシモト', 'イトウ', 'ババ', 'カネダ', 'ワダ', 'ハマダ']
# OUTPUT
[ ['ア', ['イトウ']], ['カ', ['カネダ', 'キシモト']], ['ハ', ['ハマダ', 'ババ']], ['ワ', ['ワダ']] ]
解答例
意外と簡単そうかな?と思ったのですが、結構ドツボにハマってしまい想像の倍くらい時間かかってしまいました。
class NameIndex
KANA = ('ア'..'ン').to_a
KANA_SENTOU = ['ア','カ','サ','タ','ナ','ハ','マ','ヤ','ラ','ワ']
NUM = [0..8, 9..18, 19..28, 29..39, 40..44, 45..59, 60..64, 65..70, 71..75, 76..81]
def self.create_index(names)
group = []
for i in 0..9 do
content = names.sort.select{|name| NUM[i] === KANA.find_index(name[0])}
key = KANA_SENTOU[i]
group << [key,content] unless content[0].nil?
end
return group
end
end
このようになりました。
改善の余地はまだまだありそうです。
KANA = ('ア'..'ン').to_a
=> ["ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ッ", "ツ", "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ヮ", "ワ", "ヰ", "ヱ", "ヲ", "ン"]
という平仮名の一覧、各行のアの段の配列、ア行、カ行・・・に対応する配列のインデックス番号の配列、をそれぞれ作成する。
与えられた名前の配列から、ア行、カ行・・・とそれぞれに該当する名前と、アカサタナなどの一文字をセットにして配列として追加する。
該当する名前のない行は何も追加せずスキップする。
という形で配列にして返しました。
他の方の解答例を見るに、やや遠回りな解き方をしてしまったのかと思います。
とてもきれいに解いていてとても参考になりました。
さいごに
なにかご指摘ありましたら、教えてください。
よろしくお願いいたします。