Fizz Buzz Astral

9

W związku z wieloma (dwoma?) Wyzwaniami związanymi z FizzBuzz opublikowanymi niedawno na PPCG, miałem ochotę wymyślić własne. Ujrzeć...

Fizz Buzz Astral

Napisz program lub funkcję, która pobiera liczbę całkowitą ni drukuje FizzBuzzdla dowolnej liczby podzielnej przez 15, Fizzdla dowolnej liczby podzielnej przez 3, i Buzzdla dowolnej liczby podzielnej przez 5, do (włącznie) n. Po wyjściu dla wszystkich imusi następować nowy wiersz. Ale jest zwrot akcji!

Za każdym razem, gdy drukujesz po raz trzeci Buzz, Buzz Lightyear w końcu rozpoznaje twoje połączenie i zawiesza się w twoim programie. Następnie przedstawia się - ale od czasu katastrofy wylądował, niektóre z jego wypowiedzi mieszają się z wynikami twojego programu:

Buzz Lightyear, Space Ranger, Universe Protection Unit.
FizzBuzz Lightyear, Space Ranger, Universe Protection Unit.

(czyli tylko Dołącz  Lightyear, Space Ranger, Universe Protection Unit.do Buzzlub FizzBuzz- bez względu na to, że masz wyświetlane inaczej Uwaga wiodącej przestrzeni).

Jednak Buzz Lightyear, który jest Kosmicznym Łowcą, ma bardzo ostry słuch, więc drukowanie FizzBuzzbędzie się liczyło do twojej Buzzliczby .

Następnie Buzz pozostaje w pobliżu, aby obronić komputer przed całym tym złym wynikiem, dopóki nie trafisz innej liczby, która jest podzielna przez 5 (lub 15, ponieważ one również są podzielne przez 5). Oznacza to, że dopóki nie będziesz musiał drukować Buzz(lub FizzBuzz) ponownie, nic nie drukujesz.

Gdy w końcu osiągniesz ten warunek, Buzz odchodzi:

To infinity and beyond!

Przykładowy wynik

Jest to oczekiwany wynik dla n = 25: (zauważ, jak przeskakuje od 16 do 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

Zasady

Opcjonalny znak nowej linii jest dopuszczalny.

To jest kod golfowy; jako taki, najkrótszy kod w bajtach wygrywa.

Załóżmy, że podane njest prawidłowe i większe niż lub równe 15 (to jest, gdy wyzwanie najpierw odbiega od standardowego fizzbuzz)

Buzz wita się, gdy „Licznik buzzów” (który liczy oba Buzzi FizzBuzz) osiągnie 3; odchodzi, gdy drukowane jest następne Buzz(w tym znowu oba Buzzi FizzBuzz).

Liczba, w której odchodzi, nie jest wliczana do następnego „licznika buzzów”; zamiast tego powinieneś zacząć odliczanie Buzzes od 0. Na przykład program działający z n = 25(przykładowym wyjściem) powinien kończyć się „licznikiem buzza” równym 1, ponieważ tyle razy Buzzwydrukowano od ostatniego odejścia.

W przypadku nupadku między jednym z przyjazdów Buzza a jednym z jego odlotów (tzn. Nadal tam jest - nic nie drukujesz), spodziewane jest pełne zakończenie. Dlatego ostatnim wierszem wyników byłoby jego wprowadzenie

Standardowe luki są zabronione.

osuka_
źródło
1
Czy potrafisz wyjaśnić oczekiwane zachowanie, gdy nznajdzie się on pomiędzy przybyciem Buzza Lightyeara a jego odejściem?
nderscore
Po prostu zamknij program. Zmienię reguły za sekundę
osuka_

Odpowiedzi:

5

JavaScript (ES6), 182 175 bajtów

  • -7 bajtów : Przeniesiono logikę Buzz Astral do wyrażenia trójstronnego 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
źródło
3

Python 2 , 185 178 172 bajtów

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

Wypróbuj online!

Wyjaśnienie

Uwaga: Buzz Lightyear pojawia się na trzecim „numerze buzz” i odjeżdża na czwartym. „Liczby Buzz” to wielokrotności pięciu. Tak więc ruchy Buzza następują w cyklu o długości 20.

Zapętlamy każdy iod 0 do input-1. (Oznacza to, że izawsze jest to o jeden mniej niż faktyczna liczba, którą rozważamy.)

Używając -~ijako skrótu do i+1, if-~i%20<16:sprawdza, czy i+1mod 20 ma 15 lub mniej. (Jeśli jest 16 do 19, Buzz Lightyear jest obecny i nie chcemy niczego wysyłać).

Wewnątrz instrukcji if chcemy drukować To infinity and beyond!na każdej wielokrotności 20 - to znaczy za każdym razem i%20jest 19. (Pamiętaj, że ijest to o jeden mniej niż rzeczywista liczba). Ponieważ i%20nigdy nie będzie większa niż 19, i%20/19będzie 1 w pożądanym przypadek, w przeciwnym razie <1. Python 2, dogodnie, obcina liczbę zmiennoprzecinkową przy pomnożeniu przez łańcuchy, więc i%20/19*"..."daje pełny łańcuch, jeśli i%20ma 19, w przeciwnym razie "".

Jeśli powyższa sprawa ma zastosowanie, nie drukujemy niczego innego. Ale jeśli pierwszym wyrażeniem jest ""(co jest fałszem), używamy, oraby kontynuować. Wyrażenia dla Fizz, Buzzoraz wprowadzenie oblicza się podobnie jak wyżej i dodano razem.

Wreszcie, jeśli żaden z tych przypadków nie ma zastosowania, drukujemy sam numer za pomocą -~i.

DLosc
źródło
2

05AB1E , 97 93 90 bajtów

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

Wypróbuj online!

Wyjaśnienie, które nastąpi po dalszym golfie.

Alternatywna wersja 97-bajtowa

>G"FizzBuzz"2ä” Lightyear,‡²ìÓ,ªÜŠí‰¿.”)˜N•9¨•3äR%15%_ÏJ“To infinity€ƒ—°!“)N20ÖèN)˜é®èN20%15›i\},
Emigna
źródło