💭
電話帳作成問題を解いてみました
これは何?
アウトプットのネタに困ったらこれ!?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