Search code examples
pythonfizzbuzz

Fizzbuzz for numbers 1 to n without using if/else/switch/loops


How can I write Fizzbuzz for numbers 1 to n without using if/else/switch/loops.

Here is the basic functionality of fizzbuzz wi managed to write without if and else:

print((n % 3 == 0) and "fizz" or "", end = "")
print((n % 5 == 0) and "buzz" or "")

How can I make it work with numbers from 1 to n without using loops/if/else/switch/assert and everything similar to those? And also instead of printing nothing when a number is not divisible by either 3 and 5 it should print the number.

Example:

n = 6

1 2 fizz 3 4 buzz 6

Note: Recursion is allowed.


Solution

  • It is a really simple recursion... (also your example output is wrong, 3 and 6 should not be printed):

    def fizzbuzz(n, i=1):
        print((i % 3 == 0) and "fizz" or "", end='')
        print((i % 5 == 0) and "buzz" or "", end='')
        print((i % 3 != 0) and (i % 5 != 0) and i or '', end=' ')
        i < n and fizzbuzz(n, i+1)
    
    
    fizzbuzz(20)
    

    it becomes a little clearer what is going on if you use if-expressions:

    def fizzbuzz(n, i=1):
        print('fizz' if i % 3 == 0 else "", end='')
        print('buzz' if i % 5 == 0 else "", end='')
        print(i if i % 3 != 0 and i % 5 != 0 else '', end=' ')
        i < n and fizzbuzz(n, i+1)
    

    ..and more obtuse if you only use one print statement:

    print('fizzbuzz' if i%15==0 else 'fizz' if i%3==0 else 'buzz' if i%5==0 else i, sep=' ')
    

    ...and then you might as well just put it all on one line...

    def fizzbuzz(n, i=1):
        print('fizzbuzz' if i%15==0 else 'fizz' if i%3==0 else 'buzz' if i%5==0 else i, sep=' ') or i < n and fizzbuzz(n, i+1)
    

    converting it back to not use if-expressions is straight-forward:

    def fizzbuzz(n, i=1):
        print(i%15==0 and 'fizzbuzz' or i%3==0 and 'fizz' or i%5==0 and 'buzz' or i) or i<n and fizzbuzz(n, i+1)