do you fail at FizzBuzz? simple prog test

Arnaud Delobelle arnodel at googlemail.com
Mon May 12 04:30:59 EDT 2008


On May 11, 4:36 am, Grant Edwards <gra... at visi.com> wrote:
> On 2008-05-11, John Machin <sjmac... at lexicon.net> wrote:
>
>
>
> >> "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".
>
> >> for i in range(1,101):
> >>     if i%3 == 0 and i%5 != 0:
> >>         print "Fizz"
> >>     elif i%5 == 0 and i%3 != 0:
> >>         print "Buzz"
> >>     elif i%5 == 0 and i%3 == 0:
> >>         print "FizzBuzz"
> >>     else:
> >>         print i
>
> >> is there a better way than my solution? is mine ok?
>
> > Try doing it using %3 and %5 only once each.
>
> for i in xrange(101):
>     print (("","Fizz")[i%3==0] + ("","Buzz")[i%5==0]) or str(i)
>
> His is better though, since it's more obvious what's intended.
>
> Here's one that's less opaque
>
> for i in xrange(101):
>     s = ""
>     if i%3 == 0: s += "Fizz"
>     if i%5 == 0: s += "Buzz"
>     if s:
>         print s
>     else:
>         print i
>

Let's not forget to generalise the problem and code it OOP-style :)

class FizzBuzzer(object):
    def __init__(self, *fizzles):
        self.fizzles = fizzles
    def translate(self, n):
        return ''.join(val for (p, val) in self.fizzles if not n%p) or
n
    def range(self, start, stop=None, step=None):
        if stop is None:
            start, stop = 0, start
        if step is None:
            step = 1
        for n in xrange(start, stop, step):
            yield self.translate(n)
    def __getitem__(self, obj):
        if isinstance(obj, slice):
            return self.range(obj.start, obj.stop, obj.step)
        else:
            return self.translate(obj)

# FizzBuzzer in action:

>>> fizzbuzz = FizzBuzzer((3, 'Fizz'), (5, 'Buzz'))
>>> for val in fizzbuzz[1:21]:
...     print val
...
1 21 1
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
>>> abc = FizzBuzzer((2, 'Ah'), (3, 'Bee'), (5, 'Cee'))
>>> list(abc[25:35])
25 35 1
['Cee', 'Ah', 'Bee', 'Ah', 29, 'AhBeeCee', 31, 'Ah', 'Bee', 'Ah']
>>>

--
Arnaud




More information about the Python-list mailing list