← Назад к вопросам

FizzBuzz

1.0 Junior🔥 281 комментариев
#Python Core

Условие

Напишите программу, которая выводит числа от 1 до n.

  • Если число делится на 3 — выведите "Fizz"
  • Если число делится на 5 — выведите "Buzz"
  • Если число делится на 3 и 5 — выведите "FizzBuzz"
  • Иначе — выведите само число

Пример

fizzbuzz(15) → [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

FizzBuzz

Классическое решение

Эта знаменитая задача часто используется на собеседованиях для проверки базовых навыков программирования. Есть несколько подходов различной сложности.

1. Наивное решение

def fizzbuzz_naive(n: int) -> list:
    """
    Простое решение с проверкой условий.
    """
    result = []
    for i in range(1, n + 1):
        if i % 15 == 0:  # Делится на 3 и 5
            result.append("FizzBuzz")
        elif i % 3 == 0:
            result.append("Fizz")
        elif i % 5 == 0:
            result.append("Buzz")
        else:
            result.append(i)
    return result

# Использование
print(fizzbuzz_naive(15))
# [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]

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

  • Проверяем условия в правильном порядке (3 и 5 перед 3 и 5 отдельно)
  • Проверяем 15 (3×5) перед 3 и 5
  • Временная сложность: O(N)
  • Пространственная: O(N) для результата

2. Решение со строковой конкатенацией

def fizzbuzz_string(n: int) -> list:
    """
    Более элегантное решение, легче расширяется.
    Вместо множественных условий строим строку.
    """
    result = []
    for i in range(1, n + 1):
        value = ""
        if i % 3 == 0:
            value += "Fizz"
        if i % 5 == 0:
            value += "Buzz"
        result.append(value or i)  # Если value пусто, берем число
    return result

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

  • Легче добавить новые правила (например, на 7 → Woof)
  • Не нужно проверять 15 отдельно
  • Более читаемо

3. Решение с функциональным подходом

def fizzbuzz_functional(n: int) -> list:
    """
    List comprehension версия.
    """
    def convert(i):
        value = ""
        if i % 3 == 0:
            value += "Fizz"
        if i % 5 == 0:
            value += "Buzz"
        return value or i
    
    return [convert(i) for i in range(1, n + 1)]

# Или совсем компактно
def fizzbuzz_compact(n: int) -> list:
    return [(
        (i % 3 == 0 and "Fizz" or "") + 
        (i % 5 == 0 and "Buzz" or "")
    ) or i for i in range(1, n + 1)]

4. Решение с использованием словаря (расширяемое)

def fizzbuzz_dict(n: int, rules: dict = None) -> list:
    """
    Обобщенное решение, где правила хранятся в словаре.
    Легко добавлять новые правила без изменения логики.
    
    rules: {делитель: строка}
    """
    if rules is None:
        rules = {3: "Fizz", 5: "Buzz"}
    
    result = []
    for i in range(1, n + 1):
        value = ""
        for divisor, word in sorted(rules.items()):
            if i % divisor == 0:
                value += word
        result.append(value or i)
    return result

# Использование
print(fizzbuzz_dict(15))  # Стандартные правила

# Расширение
print(fizzbuzz_dict(21, {3: "Fizz", 5: "Buzz", 7: "Woof"}))
# [1, 2, "Fizz", 4, "Buzz", "Fizz", "Woof", 8, "Fizz", "Buzz", 11, "Fizz", 13, "Woof", "FizzBuzz", 16, 17, "Fizz", 19, "Buzz", "FizzWoof"]

5. Решение с использованием класса (ООП подход)

class FizzBuzzRule:
    """Правило FizzBuzz"""
    def __init__(self, divisor: int, word: str):
        self.divisor = divisor
        self.word = word
    
    def check(self, num: int) -> str:
        return self.word if num % self.divisor == 0 else ""

class FizzBuzz:
    """Генератор FizzBuzz последовательности"""
    def __init__(self, rules: list = None):
        if rules is None:
            rules = [
                FizzBuzzRule(3, "Fizz"),
                FizzBuzzRule(5, "Buzz")
            ]
        self.rules = rules
    
    def generate(self, n: int) -> list:
        result = []
        for i in range(1, n + 1):
            value = "".join(rule.check(i) for rule in self.rules)
            result.append(value or i)
        return result

# Использование
fizzbuzz = FizzBuzz()
print(fizzbuzz.generate(15))

# Расширение
custom_rules = [
    FizzBuzzRule(3, "Fizz"),
    FizzBuzzRule(5, "Buzz"),
    FizzBuzzRule(7, "Woof")
]
fizzbuzz_extended = FizzBuzz(custom_rules)
print(fizzbuzz_extended.generate(21))

6. Generator версия (для больших n)

def fizzbuzz_generator(n: int):
    """
    Вместо возврата списка, генерируем значения по одному.
    Экономит память для больших n.
    """
    for i in range(1, n + 1):
        value = ""
        if i % 3 == 0:
            value += "Fizz"
        if i % 5 == 0:
            value += "Buzz"
        yield value or i

# Использование
for item in fizzbuzz_generator(15):
    print(item)

# Или преобразовать в список
result = list(fizzbuzz_generator(15))

Сравнение подходов

ПодходПростотаРасширяемостьКогда использовать
НаивноеЛегкоПлохоНа собеседовании, быстрый старт
СтроковоеСреднеХорошоЕсли нужны вариации
ФункциональноеСреднеПлохоКогда нравится list comprehension
СловарьСреднеОтличноProduction код
ООПСложноОтличноБольшой проект с расширениями
GeneratorСреднеХорошоБольшие N или потоковая обработка

На собеседовании

Что показать интервьюеру:

  1. Базовое решение (1-2 минуты)
def fizzbuzz(n):
    return [(i % 3 == 0 and "Fizz" or "") + (i % 5 == 0 and "Buzz" or "") or i for i in range(1, n + 1)]
  1. Объяснить логику → порядок проверок
  2. Предложить улучшение → словарь для правил
  3. Если интересует → обсудить расширяемость

Ошибки, которых избегать:

  • Проверять 15 вместо (3 и 5)
  • Забыть or i для чисел
  • Использовать elif вместо if для конкатенации
FizzBuzz | PrepBro