Fizz Buzz Lightyear

9

После многих (двух?) Проблем, связанных с 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попадания между одним из прибытий Базза и одним из его отъездов (т. Е. Он все еще там - вы ничего не печатаете), ожидается изящное завершение. Поэтому последней строкой вывода будет его введение

Стандартные лазейки запрещены.

osuka_
источник
1
Можете ли вы уточнить ожидаемое поведение, когда он nпопадает между прибытием Базз Лайтер и его отъездом?
nderscore
Просто выйдите из программы. Я буду редактировать правила в секунду
osuka_

Ответы:

5

Javascript (ES6), 182 175 байт

  • -7 байт : перемещена логика Buzz Lightyear в троичное выражение Buzz.

f=(n,s=i=b=_='')=>i++<n?f(n,s+`${(i%3?_:'Fizz')+(i%5?_:`Buzz${++b%3?_:` Lightyear, Space Ranger, Universe Protection Unit.${(i+=5)>n?_:`
To infinity and beyond!`}`}`)||i}
`):s
<!-- snippet demo: -->
<input oninput=o.innerHTML=f(this.value)>
<pre id=o>

nderscore
источник
3

Python 2 , 185 178 172 байта

for i in range(input()):
 if-~i%20<16:print i%20/19*"To infinity and beyond!"or i%3/2*"Fizz"+i%5/4*"Buzz"+i%20/14*" Lightyear, Space Ranger, Universe Protection Unit."or-~i

Попробуйте онлайн!

объяснение

Обратите внимание: 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.

DLosc
источник
2

05AB1E , 97 93 90 байт

>GN"FizzBuzz"2äN35SÖÏJ)˜1(è“To infinity€ƒ—°!“)N20%©_è®15Q” Lightyear,‡²ìÓ,ªÜŠí‰¿.”×J®16‹i,

Попробуйте онлайн!

Объяснение, чтобы прийти после дальнейшего игры в гольф.

Альтернативная 97-байтовая версия

>G"FizzBuzz"2ä” Lightyear,‡²ìÓ,ªÜŠí‰¿.”)˜N•9¨•3äR%15%_ÏJ“To infinity€ƒ—°!“)N20ÖèN)˜é®èN20%15›i\},
Emigna
источник