アウトプットのネタに困ったらこれ!?
こちらの記事を参考にして、今回は「電話帳作成問題」を解いてみました。とりあえず「動くだけ」のコードでもいいから、自分で最後まで考えて解きたいという気持ちで望んでいます。初めから効率的なやり方を考えたわけではなく、場当たり的に課題に対処したため、コードとしては不適切な部分があります。ご意見いただけるとありがたいです。
#INPUT
['キシモト', 'イトウ', 'ババ', 'カネダ', 'ワダ', 'ハマダ']
#OUTPUT
[ ['ア', ['イトウ']], ['カ', ['カネダ', 'キシモト']], ['ハ', ['ハマダ', 'ババ']], ['ワ', ['ワダ']] ]
このように、カタカナ文字列の配列を渡すと、ア段の音別にグループ分けした配列を返すプログラムを作成する問題になります。
コメントを参考にして1部修正して、最終的にこのようなコードになりました。
def phone_book(names)
a = ("ア".."オ").to_a
ka = ("カ".."ゴ").to_a
sa = ("サ".."ゾ").to_a
ta = ("タ".."ド").to_a
na = ("ナ".."ノ").to_a
ha = ("ハ".."ポ").to_a
ma = ("マ".."モ").to_a
ya = ("ヤ".."ヨ").to_a
ra = ("ラ".."ロ").to_a
wa = ("ワ".."ン").to_a
kana = [a, ka, sa, ta, na, ha, ma, ya, ra, wa]
kana_row = 'アカサタナハマヤラワ'.chars.map{|c| [c,[]]}
num = 0
number_of_names = names.length - 1
names_array = []
while num <= number_of_names
first_character = names.slice(num).slice(0)
kana.map{|row|
if row.include?(first_character)
count = 0
while count <= 9
if row == kana[count]
kana_row[count][1].insert(0,names[num])
end
count += 1
end
end
}
num += 1
end
kana_row.map{ |row_content|
if row_content[1][0] != nil
row_content[1].sort!
names_array << row_content
end
}
p names_array
end
names = ['キシモト', 'イトウ', 'ババ', 'カネダ', 'ワダ', 'ハマダ']
phone_book(names)
#実行結果 [["ア", ["イトウ"]], ["カ", ["カネダ", "キシモト"]], ["ハ", ["ハマダ", "ババ"]], ["ワ", ["ワダ"]]]
names = ['フクダ', 'キムラ', 'タナカ', 'ハシモト', 'オカモト', 'ゴトウ']
phone_book(names)
# 実行結果 [["ア", ["オカモト"]], ["カ", ["キムラ", "ゴトウ"]], ["タ", ["タナカ"]], ["ハ", ["ハシモト", "フクダ"]]]
names = ['ワタナベ', 'ヨシダ', 'マツモト', 'ナガタ', 'ドウモト','タチバナ', 'チバ']
phone_book(names)
# 実行結果 [["タ", ["タチバナ", "チバ", "ドウモト"]], ["ナ", ["ナガタ"]], ["マ", ["マツモト"]], ["ヤ", ["ヨシダ"]], ["ワ", ["ワタナベ"]]]
とりあえず「動くだけ」のコードを書くことができましたが、まだまだ適切なコードであるとは言えません。恥ずかしいコードを晒すことになりましたが、親切にコメントして下さると嬉しいです。