The counting game FizzBuzz has become a popular interview challenge for programming jobs. An interviewee should be able to prove basic competency by whipping up a functioning version in a minute or two. The rules are as follows:
Output a set of numbers (say, 1-15), but whenever a number is divisible by 3, you output “Fizz” instead. If it’s divisible by 5, you output “Buzz” instead. If it’s divisible by 3 and 5, you output “FizzBuzz” instead.
While it’s true that a rough-and-ready script-style version can be hacked together in a minute, it’s possible to learn a surprising amount of the Ruby language, best practices and toolsets merely by applying some creativity. Thus, “7 Degrees of FizzBuzz”.
To stretch your Ruby muscles, attempt the following seven challenges in the order they appear, building on your previous version with each new challenge. Useful resources are included to help you discover a number of the standard tools of the larger Ruby ecosystem.
Hopefully this adventure will expose you to a few new Ruby concepts (the more the better!), but if it’s all “old hat” to you, there are many benefits to treating it as a code kata: doing it from scratch regularly to improve efficiency and explore new options.
Have fun with it!
The “simplest thing that could possibly work”: i.e., a script. A typical implementation takes roughly a dozen lines. Hint: % is Ruby’s “modulo” operator… a % b divides a by b and returns the remainder. Resources: Ruby Docs, The Pickaxe Book
Wrap your script in a method that accepts an argument of how many numbers to output. The method will output the results itself.
Alter your method so that it collects the results and returns them to the caller. The caller will output the results.
Wrap your method in a class that also implements methods returning output as plain-text, JSON and HTML.
Test your class using the popular RSpec Test Framework. Does it:
* Return the correct response for the individual numbers 9, 10, 11 and 30?
* Does the class respond correctly when called with arguments of 15, 0, the string “fifteen” and nil (i.e.,
* Do the 3 output methods return expected results?