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- то, що ви б в іншому випадку відображається Зверніть увагу на провідне місце.)

Однак у Buzz Lightyear, оскільки він є космічним рейнджером, дуже гострий слух, і тому друк FizzBuzzбуде рахуватися з вашим Buzzрахунком .

Потім Buzz зависає, щоб захистити ваш комп’ютер від усього цього злого виходу, поки ви не потрапите на інше число, яке ділиться на 5 (або 15, оскільки їх також ділимо на 5). Це означає, поки вам не доведеться знову друкувати Buzz(або FizzBuzz), ви нічого не друкуєте.

Коли ви нарешті досягнете такої умови, Buzz відходить:

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" (який нараховує і те, Buzzі FizzBuzz) потрапляє на 3; він відходить, коли друкується наступне Buzz(включаючи, знову ж, і те, Buzzі інше FizzBuzz).

Кількість, в якій він відправляється, не зараховується до наступного "лічильника Buzz"; замість цього слід Buzzзнову починати рахувати es з 0. Наприклад, програма, запущена з n = 25(наприклад, вихід), повинна закінчуватися "лічильником Buzz" 1, оскільки саме стільки разів Buzzбуло надруковано за останній раз, коли він вийшов.

Якщо ви nпотрапите між одним із приїздів Базза та одним з виїздів (тобто він все ще є - ви нічого не друкуєте), очікується витончене припинення. Тому останнім рядком випуску було б його введення

Стандартні лазівки заборонені.


1
Чи можете ви пояснити очікувану поведінку, коли nпотрапляє між приїздом Buzz Lightyear і його від'їздом?
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>


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 прибуває на третьому "номері гудіння" і відправляється на четвертому. "Номери гуду" кратні п'яти. Таким чином, рухи Buzz відбуваються на циклі довжиною 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%2019. (Пам'ятайте, що iце на один менший від фактичного числа.) Оскільки i%20ніколи не буде більше 19, i%20/19буде 1 бажане випадок, <1 інакше. Python 2, зручно, усікає, плаває при множенні на рядки, тому i%20/19*"..."дає повний рядок, якщо він i%20становить 19, інакше"" .

Якщо зазначений вище випадок стосується, ми більше нічого не друкуємо. Але якщо перший вираз є ""(який хибний), ми використовуємо orдля продовження. Вирази для Fizz, Buzzта вступ обчислюються аналогічно вищезгаданому та додаються разом.

Нарешті, якщо жоден із цих випадків не застосовується, ми друкуємо сам номер -~i .


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\},
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.