@vladshulkevich
QA tester

Реализация решения задачи Холланда fizzbuzz. Как работает код?

нужно напечатать числа от 1 до 100, только если число делится нацело на 3, напечатать слово "fizz", если на 5 — "buzz", а если делится на 15, то — "fizzbuzz"

import math

def fizzbuzz(i):
    return [str(i), 'fizz', 'buzz', 'fizzbuzz'][3 - math.ceil((i % 3) / 2) * 2 - math.ceil((i % 5) / 4)]

for i in range(1, 101):
    print(fizzbuzz(i))

Этот код выдает эксепшен: TypeError: list indices must be integers, not float
То есть то, что должно вычисляться в индексе списка, а это должно быть 0, 1, 2 или 3, не конвертируется в инт. Но по замыслу, как эта формула работает?
  • Вопрос задан
  • 897 просмотров
Решения вопроса 1
Тут физы с базами перепутаны :)
По замыслу это работает так:
Заходит число 3
[3 - math.ceil((3 % 3) / 2) * 2 - math.ceil((3 % 5) / 4)]
Вначале считается вот эта часть math.ceil((3 % 3) / 2) * 2
3 % 3 = 0
0 / 2 = 0
0 * 2 = 0
Далее считаем math.ceil((3 % 5) / 4):
3 % 5 = 3
ceil от 3/4 = 1
Соответственно получаем:
3 - 0 - 1 = 2
И возвращаем [str(i), 'fizz', 'buzz', 'fizzbuzz'][2]

Допустим зайдёт число 4:
math.ceil((4 % 3) / 2) * 2
4 % 3 = 1
1 / 2 = 0.5 => ceil(0.5) = 1
1 * 2 = 2

math.ceil((4 % 5) / 4)
4 % 5 = 4
4 / 4 = 1

3 - 2 - 1 = 0
Вернёт [str(i), 'fizz', 'buzz', 'fizzbuzz'][0]

Кстати в 3-ем питоне всё прекрасно работает, т.к. ceil возвращает int.

P.S.: Я, когда развлекался, решил вот таким способом:

fizzbuzz = lambda x: "Fizz Buzz" if x % 5 == 0 and x % 3 == 0 else "Fizz" if x % 3 == 0 else "Buzz" if x % 5 == 0 else x

for i in range(1,101):
  fizzbuzz(i)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
AnnTHony
@AnnTHony
Интроверт
У меня отрабатывает без ошибок.
Смысл формулы в получении индекса элемента в допустимых пределах, т.е. не выходя за рамки [0..3].
Если более подробно:
i % 3 при любом i дает [0..2]
i % 5 при любом i дает [0..4]

math.ceil((i % 3) / 2) * 2 дает не больше 2
math.ceil((i % 5) / 4) дает не больше 1

Получается 3 - [0..2] - [0..1] = [0..3]
Ответ написан
Комментировать
Типичный случай (не нашел слова)
Ceil результат нужно привести к целому
Ответ написан
@vladshulkevich Автор вопроса
QA tester
Как самому научиться сочинять такие формулы?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы