Forum: Ruby Re: [QUIZ] FizzBuzz (#126)

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
B1f06f732d86e562563db728b2875eb2?d=identicon&s=25 jwmerrill@gmail.com (Guest)
on 2007-06-06 07:11
(Received via mailing list)
If I wanted to show them how eXtreme I was, I would start by writing
some tests:

-----
# fizzbuzz_test.rb

require 'spec'
require 'fizzbuzz'

describe :fizzbuzz do
 # This is just so we can read the results of all those 'puts'
 before do
   @output = StringIO.new()
   $stdout = @output
   fizzbuzz()
   @output.rewind
   @lines = @output.readlines.map {|str| str.chop}
 end

 after do
   $stdout = STDOUT
 end

 it "should print 1 as the first line" do
   @lines[0].to_i.should == 1
 end

end
-----

Then we make it pass

-----
# fizzbuzz.rb

def fizzbuzz()
 puts 1
end

if __FILE__ == $0
 fizzbuzz()
end
-----

Add another test

-----
# fizzbuzz_test.rb

it "should have 100 lines" do
 @lines.size.should == 100
end
-----

Make it pass

-----
# fizzbuzz.rb

def fizzbuzz()
 (1..100).each do |num|
   puts num
 end
end
-----

Keep the rhythm going

-----
# fizzbuzz_test.rb

it "should print 'Fizz' as the third line" do
 @lines[2].should == 'Fizz'
end
-----
# fizzbuzz.rb

def fizzbuzz()
 (1..100).each do |num|
   if num % 3 == 0
     puts 'Fizz'
   else
     puts num
   end
 end
end
-----
# fizzbuzz_test.rb

it "should print 'Buzz' as the fifth line" do
 @lines[4].should == 'Buzz'
end
-----
# fizzbuzz.rb

def fizzbuzz()
   if num % 3 == 0
     puts 'Fizz'
   elsif num % 5 == 0
     puts 'Buzz'
   else
     puts num
   end
 end
end
-----
# fizzbuzz_test.rb

it "should print 'FizzBuzz' as the fifteenth line" do
 @lines[14].should == 'FizzBuzz'
end
-----
# fizzbuzz.rb

def fizzbuzz()
 (1..100).each do |num|
   if num % 15 == 0
     puts 'FizzBuzz'
   elsif num % 3 == 0
     puts 'Fizz'
   elsif num % 5 == 0
     puts 'Buzz'
   else
     puts num
   end
 end
end
-----

And one more for good measure:

-----
# fizzbuzz_test.rb

it "should print 'Buzz' as the last line" do
 @lines.last.should == 'Buzz'
end
-----

The final results are

-----
# fizzbuzz.rb

def fizzbuzz()
 (1..100).each do |num|
   if num % 15 == 0
     puts 'FizzBuzz'
   elsif num % 3 == 0
     puts 'Fizz'
   elsif num % 5 == 0
     puts 'Buzz'
   else
     puts num
   end
 end
end

if __FILE__ == $0
 fizzbuzz()
end
-----
# fizzbuzz_test.rb

require 'spec'
require 'fizzbuzz'

describe :fizzbuzz do
 # This is just so we can read the results of all those 'puts'
 before do
   @output = StringIO.new()
   $stdout = @output
   fizzbuzz()
   @output.rewind
   @lines = @output.readlines.map {|str| str.chomp}
 end

 after do
   $stdout = STDOUT
 end

 it "should print 1 as the first line" do
   @lines[0].to_i.should == 1
 end

 it "should print 100 lines" do
   @lines.size.should == 100
 end

 it "should print 'Fizz' as the third line" do
   @lines[2].should == 'Fizz'
 end

 it "should print 'Buzz' as the fifth line" do
   @lines[4].should == 'Buzz'
 end

 it "should print 'FizzBuzz' as the fifteenth line" do
   @lines[14].should == 'FizzBuzz'
 end

 it "should print 'Buzz' as the last line" do
   @lines.last.should == 'Buzz'
 end

end
-----

Now before pulling such a stunt, I might ask plainly if they were
looking for a trivial solution to a trivial problem, in which case I
would immediately write down the final answer, or if they wanted me to
suspend disbelief and imagine this is a part of a large and important
system rather than a one off game, in which case I might do the
previous.  After all, who wants to work for people that make you guess
what they want?

Jason Merrill
This topic is locked and can not be replied to.