💭

電話帳作成問題を解いてみました

に公開

これは何?

アウトプットのネタに困ったらこれ!?Ruby初心者向けのプログラミング問題を集めてみた(全10問)に記載されている電話帳作成問題を解いたもの。

実装

phone_number.rb
# frozen_string_literal: true

class PhoneNumber
  class Pattern
    attr_reader :key, :match_chars

    def initialize(key, match_chars)
      @key = key
      @match_chars = match_chars
    end
  end

  PATTERNS = [
    Pattern.new('ア', %w[ア イ ウ エ オ]),
    Pattern.new('カ', %w[カ キ ク ケ コ]),
    Pattern.new('サ', %w[サ シ ス セ ソ]),
    Pattern.new('タ', %w[タ チ ツ テ ト]),
    Pattern.new('ナ', %w[ナ ニ ヌ ネ ノ]),
    Pattern.new('ハ', %w[ハ ヒ フ ヘ ホ]),
    Pattern.new('マ', %w[マ ミ ム メ モ]),
    Pattern.new('ヤ', %w[ヤ ユ ヨ]),
    Pattern.new('ラ', %w[ラ リ ル レ ロ]),
    Pattern.new('ワ', %w[ワ ヲ ン]),
    Pattern.new('カ', %w[ガ ギ グ ゲ ゴ]),
    Pattern.new('サ', %w[ザ ジ ズ ゼ ゾ]),
    Pattern.new('タ', %w[ダ ヂ ヅ デ ド]),
    Pattern.new('ハ', %w[バ ビ ブ ベ ボ])
  ].freeze

  def solve(input_arr)
    hash = Hash.new { |h, k| h[k] = [] }

    input_arr.each do |input|
      PATTERNS.each do |pattern|
        hash[pattern.key] << input if pattern.match_chars.include?(input[0])
      end
    end

    hash.each { |k, v| hash[k] = v.sort }.sort.to_a
  end
end
phone_number_spec.rb
# frozen_string_literal: true

RSpec.describe PhoneNumber do
  describe '#solve' do
    subject { described_class.new.solve(input_arr) }

    context '例として記載されている入力の場合' do
      let(:input_arr) { %w[キシモト イトウ ババ カネダ ワダ ハマダ] }

      it { is_expected.to eq [['ア', ['イトウ']], ['カ', %w[カネダ キシモト]], ['ハ', %w[ハマダ ババ]], ['ワ', ['ワダ']]] }
    end

    context 'ア行の苗字が3つある場合' do
      let(:input_arr) { %w[アサヒ アイダ アオイ] }

      it { is_expected.to eq [['ア', %w[アイダ アオイ アサヒ]]] }
    end
  end
end

感想

細かくやると心が折れそうなので、おおざっぱな仕様のみ実装してみました。具体的には小さなヤとかに対応していません。(苗字だから、そもそも入力としてないかもしれません)

Discussion