LoginSignup
8
5

More than 5 years have passed since last update.

コード晒し:単語のカウント(PaizaランクC相当)

Posted at

はじめに

己に課したコード晒し修行(参考)。
言語は 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技術者認定試験の勉強中なので、おぼえたての標準クラスのメソッドをできる限り使うように心がけました。

コード

count_words.rb
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と処理上はほとんど変わらないわけだし
 

まとめ

ん~読みやすいコードを書く修行のためにはもう少し複雑な問題を使った方がいいのでしょうか。もうしばらく試行錯誤して、修正するかもしれません。

8
5
2

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
8
5