FizzBuzz — это классическая задача на программирование, которая часто используется на собеседованиях для проверки базовых навыков кодирования. Несмотря на кажущуюся простоту, она помогает оценить:

  • Понимание условных операторов

  • Умение работать с циклами

  • Внимание к деталям (краевым случаям)

Формулировка задачи:
Напишите программу, которая выводит числа от 1 до N, но:

  • Если число делится на 3 → выводится "Fizz"

  • Если делится на 5 → "Buzz"

  • Если делится и на 3, и на 5 → "FizzBuzz"

  • Иначе выводится само число


Базовые реализации

 Классическое решение (if-else)

 

def fizzbuzz(n):
    for i in range(1, n+1):
        if i % 15 == 0:
            print("FizzBuzz")
        elif i % 3 == 0:
            print("Fizz")
        elif i % 5 == 0:
            print("Buzz")
        else:
            print(i)

Особенности:

  • Проверка делимости на 15 идет первой (чтобы избежать ложных срабатываний)

  • Порядок условий важен!

Решение с конкатенацией (без проверки %15)

def fizzbuzz(n):
    for i in range(1, n+1):
        output = ""
        if i % 3 == 0:
            output += "Fizz"
        if i % 5 == 0:
            output += "Buzz"
        print(output or i)

Преимущества:

  • Более гибкое (легко добавить новые условия, например "Jazz" для 7)

  • Нет дублирования кода


Неочевидные оптимизации

 Избегание операции % (для ограниченных N)

def fizzbuzz(n):
    c3, c5 = 0, 0
    for i in range(1, n+1):
        c3 += 1
        c5 += 1
        output = ""
        if c3 == 3:
            output += "Fizz"
            c3 = 0
        if c5 == 5:
            output += "Buzz"
            c5 = 0
        print(output or i)

Плюсы:

  • Замена дорогой операции % на инкремент и сравнение
    Минусы:

  • Менее читаемо

 Решение с match-case (Python 3.10+)

def fizzbuzz(n):
    for i in range(1, n+1):
        match (i % 3, i % 5):
            case (0, 0): print("FizzBuzz")
            case (0, _): print("Fizz")
            case (_, 0): print("Buzz")
            case _: print(i)

Почему FizzBuzz — важный тест?

  1. Фильтр базовых навыков

  2. Выявляет проблемы:

    • Незнание оператора %

    • Неправильный порядок условий

    • Ошибки в граничных значениях (1 и N)

  3. Расширяемость задачи

    • Добавление новых условий ("Jazz" для 7)

    • Генерация последовательности без if


Продвинутые вариации

 FizzBuzz без условных операторов

 

def fizzbuzz(n):
    for i in range(1, n+1):
        print(["FizzBuzz", "Fizz", "Buzz", str(i)]
              [(i % 3 != 0 and i % 5 != 0) + 2*(i % 5 == 0)])

 Однострочник (Python)

print('\n'.join("Fizz"*(i%3==0)+"Buzz"*(i%5==0) or str(i) for i in range(1,101)))