После многих (двух?) Проблем, связанных с FizzBuzz, опубликованных недавно на PPCG, у меня возник соблазн придумать свою собственную. Вот ...
Fizz Buzz Lightyear
Напишите программу или функцию, которая принимает целое число n
и печатает FizzBuzz
для любого числа, кратного 15, Fizz
для любого числа, кратного 3, и Buzz
для любого числа, кратного 5, вплоть до (и включая) n
. Вывод для всех i
должен сопровождаться переводом строки. Но есть поворот!
Каждый третий раз, когда вы печатаете Buzz
, Buzz Lightyear, наконец, прислушивается к вашему вызову и терпит крах в вашей программе. Затем он представляет себя - но с тех пор, как он потерпел крах, некоторые из его слов смешались с результатами вашей программы:
Buzz Lightyear, Space Ranger, Universe Protection Unit.
FizzBuzz Lightyear, Space Ranger, Universe Protection Unit.
(то есть, только Append Lightyear, Space Ranger, Universe Protection Unit.
к Buzz
или FizzBuzz
- то, что вы бы в противном случае отображается Обратите внимание на ведущее место.)
Тем не менее, Базз Лайтер, будучи космическим рейнджером, имеет очень острый слух, и поэтому печать FizzBuzz
будет учитываться при Buzz
подсчете .
Затем Buzz слоняется вокруг, чтобы защитить ваш компьютер от всех этих злых выводов, пока вы не наберете другое число, которое делится на 5 (или 15, поскольку они тоже делятся на 5). Это означает, что пока вам не придется печатать Buzz
(или FizzBuzz
) снова, вы вообще ничего не печатаете.
Когда вы наконец достигли этого состояния, Базз отправляется:
To infinity and beyond!
Пример вывода
Это ожидаемый результат для n = 25
: (обратите внимание, как он пропускает с 16 по 19)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz Lightyear, Space Ranger, Universe Protection Unit.
To infinity and beyond!
Fizz
22
23
Fizz
Buzz
правила
Необязательный завершающий перевод новой строки приемлем.
Это код гольф; как таковой, самый короткий код, в байтах, выигрывает.
Предположим, что данные n
действительны и больше или равны 15 (то есть, когда задача впервые отклоняется от стандартного fizzbuzz)
Buzz приветствует вас, когда «Buzz Counter» (который считает оба Buzz
и FizzBuzz
) достигает 3; он уходит, когда печатается следующее Buzz
(включая, опять же, оба Buzz
и FizzBuzz
).
Число, с которого он отправляется, не засчитывается в счет следующего «счетчика жужжания»; вместо этого вы должны Buzz
снова начать отсчет es с 0. Например, программа, запущенная с n = 25
(пример вывода), должна заканчиваться «Счетчиком жужжания», равным 1, поскольку именно столько раз Buzz
было напечатано с момента последнего отъезда.
В случае n
попадания между одним из прибытий Базза и одним из его отъездов (т. Е. Он все еще там - вы ничего не печатаете), ожидается изящное завершение. Поэтому последней строкой вывода будет его введение
Стандартные лазейки запрещены.
n
попадает между прибытием Базз Лайтер и его отъездом?Ответы:
Javascript (ES6),
182175 байтисточник
Python 2 ,
185178172 байтаПопробуйте онлайн!
объяснение
Обратите внимание: Buzz Lightyear прибывает на третье «число гудения» и уходит на четвертое. «Жужжание» - это число, кратное пяти. Таким образом, движения Базза происходят по циклу длины 20.
Мы перебираем каждую
i
от 0 до input-1. (Это означает, чтоi
это всегда на единицу меньше действительного числа, которое мы рассматриваем.)Использование
-~i
в качестве ярлыка дляi+1
,if-~i%20<16:
проверяет, является лиi+1
мод 20, 15 или ниже. (Если это от 16 до 19, Buzz Lightyear присутствует, и мы не хотим ничего выводить.)Внутри оператора if мы хотим печатать
To infinity and beyond!
на каждом кратном 20, то есть каждый разi%20
равен 19. (Помните, чтоi
это на единицу меньше действительного числа.) Посколькуi%20
никогда не будет больше 19,i%20/19
будет 1 в желаемом случай, <1 в противном случае. Python 2, удобно, усекает числа с плавающей запятой при умножении на строки, поэтомуi%20/19*"..."
дает полную строку, еслиi%20
равно 19, в противном случае""
.Если приведенный выше случай применим, мы больше ничего не печатаем. Но если первое выражение
""
(ложное), мы используем,or
чтобы продолжать идти. Выражения дляFizz
,Buzz
и введение вычисляются аналогично приведенному выше и складываются вместе.Наконец, если ни один из этих случаев не применим, мы печатаем само число с помощью
-~i
.источник
05AB1E ,
979390 байтПопробуйте онлайн!
Объяснение, чтобы прийти после дальнейшего игры в гольф.
Альтернативная 97-байтовая версия
источник