RubyでFizzBuzzを書いてみた

ネタは前回の記事のデコレータ式と同じだけど、Rubyだとこんな感じになる。
余計なメソッドが多いのは、なんとなくRubyっぽいからです。特に意味はない。

仕様

前回と同じ

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

テストコード

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require './fizzbuzz'

  
describe "FizzBuzz" do
  describe "one" do
    subject { 1 }
    it { should_not be_fizz }
    it { should_not be_buzz }
    it { should_not be_fizzbuzz }
    its(:fizzbuzz) { should == '1' }
  end
  describe "three" do
    subject { 3 }
    it { should be_fizz }
    it { should_not be_buzz }
    it { should_not be_fizzbuzz }
    its(:fizzbuzz) { should == 'Fizz' }
  end 
  describe "five" do
    subject { 5 }
    it { should_not be_fizz }
    it { should be_buzz }
    it { should_not be_fizzbuzz }
    its(:fizzbuzz) { should == 'Buzz' }
  end
  describe "fifteen" do
    subject { 15 }
    it { should_not be_fizz }
    it { should_not be_buzz }
    it { should be_fizzbuzz }
    its(:fizzbuzz) { should == 'FizzBuzz' }
  end
end

テスト実行結果

FizzBuzz
  one
    should not be fizz
    should not be buzz
    should not be fizzbuzz
    fizzbuzz
      should == "1"
  three
    should be fizz
    should not be buzz
    should not be fizzbuzz
    fizzbuzz
      should == "Fizz"
  five
    should not be fizz
    should be buzz
    should not be fizzbuzz
    fizzbuzz
      should == "Buzz"
  fifteen
    should not be fizz
    should not be buzz
    should be fizzbuzz
    fizzbuzz
      should == "FizzBuzz"

Finished in 0.00265 seconds
16 examples, 0 failures

FizzBuzzの実装

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

class Numeric
  def fizz?
    not fizzbuzz? and self % 3 == 0
  end
  def buzz? 
    not fizzbuzz? and self % 5 == 0
  end
  def fizzbuzz?
    self % 3 == 0 and self % 5 == 0
  end
  def fizzbuzz
    if fizz?
      'Fizz'
    elsif buzz?
      'Buzz'
    elsif fizzbuzz?
      'FizzBuzz'
    else
      self.to_s 
    end
  end
end

if __FILE__ == $0
  (1..100).each { |x| puts x.fizzbuzz }
end

fizzbuzz.rb を実行すると、「1, 2, Fizz, ... , 98, Fizz, Buzz」が標準出力に表示される。