On Sun, 03 Jun 2007 13:55:56 -0400, S.Volkov wrote: > #!/bin/env ruby > > =begin > "Ruby Quiz" <james / grayproductions.net> wrote in message > news:20070601122814.XMOR28308.eastrmmtao105.cox.net / eastrmimpo02.cox.net... > .. >> Write a program that prints the numbers from 1 to 100. >> But for multiples of three print "Fizz" instead of the >> number and for the multiples of five print "Buzz". For >> numbers which are multiples of both three and five >> print "FizzBuzz". >> >> Pretend you've just walked into a job interview and been hit with this >> question. >> Solve it as you would under such circumstances for this week's Ruby Quiz. > > The task itself is quite boring, so I decided to imagine how > different programmers may try to pass the interview. > I hope we'll see what the recruiter may think. > > Oh! And I played golf, just for fun, hope you will enjoy it too. > =end > > ## > # Q126 solution > # by Sergey Volkov > ## > > ## > # job interview style > ## > # Java programmer > def sol1 maxn=100 > for i in 1..maxn > if i%3 == 0 && i%5 == 0 > puts "FizzBuzz" > elsif i%3 == 0 > puts "Fizz" > elsif i%5 == 0 > puts "Buzz" > else > puts i > end > end > end > puts '### TC1' > sol1 15 > > ## > # Same as above, > # but the code is more manageable > def sol1a maxn=100 > for i in 1..maxn > if i%3 == 0 && i%5 == 0 > s = "FizzBuzz" > elsif i%3 == 0 > s = "Fizz" > elsif i%5 == 0 > s = "Buzz" > else > s = i.to_s > end > puts s > end > end > puts '### TC1a' > sol1a 15 > > ## > # Lisp programmer > def sol2 maxn=100 > puts( (1..maxn).map{ |i| > i2s=lambda{ |n,s| > if (i%n).zero? : s else '' end > } > lambda{ |s| > if s.empty? : i else s end > }.call i2s[3,'Fizz'] + i2s[5,'Buzz'] > } ) > end > puts '### TC2' > sol2 15 > > ## > # 1 year of Ruby experience > def sol3 maxn=100 > 1.upto(maxn){ |n| > s = "Fizz" if (n%3).zero? > (s||='') << "Buzz" if (n%5).zero? > puts s||n > } > end > puts '### TC3' > sol3 15 > > ## > # Trying to get extra points for reusability.. > class Fixnum > def toFizzBuzz > s = 'Fizz' if modulo(3).zero? > s = "#{s}Buzz" if modulo(5).zero? > s || to_s > end > end > def sol4 maxn > 1.upto(maxn){ |n| puts n.toFizzBuzz } > end > puts '### TC4' > sol4 15 > > ## > # Extra points for expandability > #.. who knows what else recruiters are looking for? > > __END__ > > ## > # Golf style > 1.upto(?d){|i|puts ["#{x=[:Fizz][i%3]}Buzz"][i%5]||x||i}# 56 > 1.upto(?d){|i|x=[:Fizz][i%3];puts i%5<1?"#{x}Buzz":x||i}# 56 > 1.upto(?d){|i|i%3<1&&x=:Fizz;puts i%5<1?"#{x}Buzz":x||i}# 56 Another 56 byter :) puts `seq 100|sed -e'5~5s/.*/Buzz/;3~3s/^[0-9]*/Fizz/'`