RubyでFizzBuzzを書いてみた
ネタは前回の記事のデコレータ式と同じだけど、Rubyだとこんな感じになる。
余計なメソッドが多いのは、なんとなくRubyっぽいからです。特に意味はない。
仕様
前回と同じ
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
テストコード
- fizzbuzz_spec.rb
#!/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」が標準出力に表示される。