#はじめに
己に課したコード晒し修行(参考)。
言語は Ruby です。
批判、コメント歓迎
#コードの内容
Paizaの練習問題「単語のカウント(Paiza Cランク相当)」
『重複ありの英単語列を与えるので、数を数えて表示しなさい』
入力 :半角スペースで区切られた長さNの文字列
期待する出力:単語、半角スペース、出現回数の順で1行に1単語で
出現したすべての単語を、列に出現する順に出力
条件 :全てのテストケースにおいて 1 ≦ N ≦ 1,000
例:
入力例2:Nagato Yukikaze Akagi Kitakami Nagato Akagi Akagi Kitakami
出力例2
Nagato 2
Yukikaze 1
Akagi 3
Kitakami 2
問題文の全文はこちら
Paizaスキルチェックは問題文、解答コード、解答のヒントをネット上に出すな、と警告されますが、練習問題はいいんじゃないかなぁ。公開の可否について以前にPaizaさんに問い合わせたのですが、解答がこないのですよね。
それはそれとして、Paizaさんの問題作成担当に提督がいることは明らか
#コーディング前の準備
Cランク相当なので、問題文は簡潔で読み込む必要などはありませんでした。
Ruby技術者認定試験の勉強中なので、おぼえたての標準クラスのメソッドをできる限り使うように心がけました。
#コード
input_words = gets.split
# p input_words #=> ["red", "green", "blue", "blue", "green", "blue"]
uniq_words = input_words.uniq
# p uniq_words #=> ["red", "green", "blue"]
uniq_words.each do | u_w |
wnum = ( input_words.select { |i_w| i_w == u_w } ).size
puts u_w + " " + wnum.to_s
end
テストケースは全てパス。各テストケースの実行時間は 0.10~0.11秒で、問題なさそうでした。
コーディングの所要時間は測っていませんでした。15分はかかってないんじゃないかと思いますが、もっとスラスラかけるようになりたい。
#見直し
名前づけがおざなり
uniq_words
input_words に uniq メソッドを適用したことから名づけたものの、
これだけを見ると意味が明瞭ではない。
u_w, i_w, wnum
スコープが短い変数なので短い名前をつけたが、省略形があるし、
これでよかったのか、という迷いがある。
uniq_word.each
脳直でやってしまいましたが、本当にこれが最適な処理なのか?
という自問自答をすべきでした。
とは言え、落ち着いて見直しても妙案は思いつかず。
単語数を数える部分がちょっと汚い
count_duplicate_word などのメソッドを作って隠ぺいした方がよかった?
というか、逆引きRubyでざっと探して見つからなかったので
selectを使って実装しましたが、
Arrayは重複を数えるメソッドを持ってそうな気がします。
やることはuniqと処理上はほとんど変わらないわけだし
#まとめ
ん~読みやすいコードを書く修行のためにはもう少し複雑な問題を使った方がいいのでしょうか。もうしばらく試行錯誤して、修正するかもしれません。