LoginSignup
0
0

More than 3 years have passed since last update.

Ruby 電話帳作成問題 解いてみた(解答例あり)

Posted at

はじめに

『プロを目指す人のための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
=> ["ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ッ", "ツ", "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ヮ", "ワ", "ヰ", "ヱ", "ヲ", "ン"]

という平仮名の一覧、各行のアの段の配列、ア行、カ行・・・に対応する配列のインデックス番号の配列、をそれぞれ作成する。
与えられた名前の配列から、ア行、カ行・・・とそれぞれに該当する名前と、アカサタナなどの一文字をセットにして配列として追加する。
該当する名前のない行は何も追加せずスキップする。
という形で配列にして返しました。

他の方の解答例を見るに、やや遠回りな解き方をしてしまったのかと思います。
とてもきれいに解いていてとても参考になりました。

さいごに

なにかご指摘ありましたら、教えてください。
よろしくお願いいたします。

参考

「Ruby初心者向けのプログラミング問題を集めてみた」の電話帳問題解いてみた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0