[Ruby][解答募集]文字列に出現する単語の個数を数えてみよう

  • 11
    いいね
  • 9
    コメント
この記事は最終更新日から1年以上が経過しています。

先日参加したRuby/Rails勉強会@関西 60thの「Ruby初級者向けレッスン」でこんな問題が出題されていたので紹介します。

問題

文字列中に含まれる単語の個数を単語ごとにカウントして、ハッシュとして表現してください。

実行例

  • 入力: "no ruby no life"
  • 出力: {"no" => 2, "ruby" => 1, "life" => 1}

自分なりの実装方法を考えてみよう

Rubyに慣れた人なら、おそらくかなり簡単な部類に入るプログラミング問題だと思います。

しかし、こんな簡単な問題でも意外と実装方法は人によって異なるものです。

実際、僕が関わっている西脇.rb & 東灘.rbのコミュニティで出題したときも、解答例は人それぞれ異なっていました。

各人の知識やこだわりの違いがコードに現れてくるので、コードを見るだけでも面白いですし、お互い勉強にもなります。

あなたも解答例をぜひコメント欄に!

そこであなたもぜひこの問題の解答例を考えてみてください!

考えたコードは直接コメント欄に記入してもらっても良いですし、gistのリンクを載せたりするのもOKです。

特に順位を決めたり景品を出したりするわけではありませんが、軽い腕試し問題としてチャレンジしてもらえればと思います。

西脇.rb & 東灘.rbではこんな感じの勉強会を開きます

今週の土曜日、2014年4月5日に開催される西脇.rb & 東灘.rbの「Rubyプログラミング Dojo」ではこんな感じで共通のプログラミング問題をみんなで解いて、最後にコードレビューをする予定です。

すでに満席になっているため、今月の勉強会に参加するのは厳しいかもしれません。
しかし、毎月神戸近辺で勉強会を開催しているので、自分でコードを書いたり他の人の書いたコードを読んだりして勉強したいというRubyistの方は、ぜひ一度遊びに来てください。

Doorkeeperでコミュニティのメンバー登録をしてもらうと、イベントの開催通知を受け取ることができます。

さいごに: 僕の解答例はこちら

僕も解答例を考えてgistに上げてみました。

僕はちょっと関数型プログラミングっぽく書くのが好きです。
あと、Ruby 2.1以降でしか使えない便利メソッドも使っています。

each_with_objectを使ってみるのもアリです。

each_with_objectの行だけ妙に長くなってしまうので、ムダにラムダを使ってみても面白いかも。

などなど、一人で考えてもやり方は様々です。

おまけ: RSpecを使って書いてみたい人向けのテンプレート

RSpecを使ってテストを自動化してみたい人はこんな感じのテンプレートを使えばテスト駆動開発ができます。
僕の解答例もこのスタイルで書いています。

# count_by_word_spec.rb

def count_by_word(string)
  # Write your code here.
end

describe "count by word" do
  it "counts by word" do
    expect(count_by_word("no ruby no life")).to eq("no" => 2, "life" => 1, "ruby" => 1)
  end
end

実行する際はターミナルから以下のように実行すればOKです。
(-cは出力結果に赤や緑の色を付けるオプション)

gem install rspec
rspec -c count_by_word_spec.rb

あわせて読みたい

前述のRuby/Rails勉強会@関西 60thでは、「How to upgrade your Rails application to RSpec 3」というタイトルで「RSpec 2で書かれたRailsのテストをRSpec 3に移行する手順」を説明(実演)してみました。

このときの内容やスライドをブログやSlideShareに上げていますので、RSpecに興味がある人は読んでみてください。