Fizz Buzz Lightyear


9

Sulla scia delle molte (due?) Sfide relative a FizzBuzz pubblicate di recente su PPCG, sono stato tentato di inventare le mie. Ecco ...

Fizz Buzz Lightyear

Scrivi un programma o una funzione che accetta un numero intero ne stampa FizzBuzzper qualsiasi numero divisibile per 15, Fizzper qualsiasi numero divisibile per 3 e Buzzper qualsiasi numero divisibile per 5, fino a (e incluso) n. L'output per tutti ideve essere seguito da una nuova riga. Ma c'è una svolta!

Per ogni terza volta che stampi Buzz, Buzz Lightyear finalmente risponde alla tua chiamata e si blocca nel tuo programma. Quindi si presenta - ma da quando è atterrato in modo anomalo, parte di ciò che ha detto si confonde con l'output del tuo programma:

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

(vale a dire, solo accodamento  Lightyear, Space Ranger, Universe Protection Unit.per Buzzo FizzBuzz- qualunque cosa sia avreste visualizzata altrimenti noti lo spazio iniziale.)

Tuttavia, Buzz Lightyear, essendo lo Space Ranger, ha un ascolto molto acuto e quindi la stampa FizzBuzzconta per il tuo Buzzconteggio .

Quindi, Buzz si blocca per difendere il tuo computer da tutta quell'uscita malvagia, fino a quando non colpisci un altro numero divisibile per 5 (o 15, poiché anche quelli sono divisibili per 5). Ciò significa che fino a quando non è necessario stampare Buzz(o FizzBuzz) di nuovo, non si stampa nulla.

Quando finalmente raggiungi quella condizione, Buzz parte:

To infinity and beyond!

Esempio di output

Questo è l'output previsto per n = 25: (nota come salta da 16 a 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

Regole

La nuova riga finale facoltativa è accettabile.

Questo è il codice golf; come tale, vince il codice più breve, in byte.

Assumi che nsia valido e maggiore o uguale a 15 (ovvero quando la sfida si discosta per la prima volta dal fizzbuzz standard)

Buzz ti saluta quando il "Buzz counter" (che conta entrambi Buzze FizzBuzz) colpisce 3; parte quando viene stampato il successivo Buzz(incluso, di nuovo, entrambi Buzze FizzBuzz).

Il numero con cui parte non conta ai fini del successivo "Buzz counter"; dovresti invece ricominciare a contare gli Buzzes da 0. Ad esempio, un programma in esecuzione con n = 25(output di esempio) dovrebbe terminare con un "contatore Buzz" di 1, poiché è quante volte è Buzzstato stampato dall'ultima volta che è partito.

Nel caso in cui nrientri tra uno degli arrivi di Buzz e una delle sue partenze (cioè, è ancora lì - non stai stampando nulla), ci si aspetta un grazioso termine. Pertanto, l'ultima riga di output sarebbe la sua introduzione

Sono vietate le scappatoie standard.


1
Puoi chiarire il comportamento previsto quando nrientra tra l'arrivo di Buzz Lightyear e la sua partenza?
nderscore,

Basta uscire dal programma.
Modificherò

Risposte:


5

Javascript (ES6), 182 175 byte

  • -7 byte : spostata la logica Buzz Lightyear nell'espressione ternaria 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 172 byte

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

Provalo online!

Spiegazione

Osservare: Buzz Lightyear arriva sul terzo "numero di buzz" e parte il quarto. I "numeri di ronzio" sono i multipli di cinque. Pertanto, i movimenti di Buzz avvengono su un ciclo di lunghezza 20.

Eseguiamo il loop su ciascuno ida 0 a input-1. (Ciò significa che iè sempre uno in meno del numero effettivo che stiamo considerando.)

Usando -~icome scorciatoia per i+1, if-~i%20<16:controlla se i+1, mod 20, è 15 o meno. (Se sono dalle 16 alle 19, Buzz Lightyear è presente e non vogliamo produrre nulla.)

All'interno dell'istruzione if, vogliamo stampare To infinity and beyond!su ogni multiplo di 20, ovvero ogni volta che i%20è 19. (Ricorda che iè uno in meno del numero effettivo.) Poiché i%20non sarà mai maggiore di 19, i%20/19sarà 1 nel valore desiderato caso, <1 altrimenti. Python 2, convenientemente, tronca i float quando si moltiplica per stringhe, quindi i%20/19*"..."fornisce l'intera stringa se i%20è 19, altrimenti "".

Se si applica il caso precedente, non stampiamo nient'altro. Ma se la prima espressione è ""(che è falsa), usiamo orper andare avanti. Le espressioni per Fizz, Buzze l'introduzione sono calcolate in modo simile a quanto sopra e sommate.

Infine, se nessuno di questi casi si applica, stampiamo il numero stesso con -~i.


2

05AB1E , 97 93 90 byte

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

Provalo online!

Spiegazione a venire dopo ulteriore golf.

Versione alternativa a 97 byte

>G"FizzBuzz"2ä” Lightyear,‡²ìÓ,ªÜŠí‰¿.”)˜N•9¨•3äR%15%_ÏJ“To infinity€ƒ—°!“)N20ÖèN)˜é®èN20%15›i\},
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.