Fizz Buzz Lightyear

9

A raíz de los muchos (¿dos?) Desafíos relacionados con FizzBuzz publicados recientemente en PPCG, he tenido la tentación de proponer los míos. Mirad...

Fizz Buzz Lightyear

Escriba un programa o función que tome un número entero ny se imprima FizzBuzzpara cualquier número divisible por 15, Fizzpara cualquier número divisible por 3 y Buzzpara cualquier número divisible por 5, hasta (e incluido) n. La salida para todos idebe ir seguida de una nueva línea. Pero hay un giro!

Por cada tercera vez que imprime Buzz, Buzz Lightyear finalmente atiende su llamada y aterriza en su programa. Luego se presenta, pero desde que se estrelló, parte de lo que dijo se mezcla con la salida de su programa:

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

(es decir, sólo se anexados  Lightyear, Space Ranger, Universe Protection Unit.a Buzzo FizzBuzz- lo que es lo que le ha mostrado lo contrario Tenga en cuenta el espacio inicial.)

Sin embargo, Buzz Lightyear, siendo el Space Ranger que es, tiene una audición muy aguda, por lo que la impresión FizzBuzzcontará para su Buzzcuenta .

Luego, Buzz se queda para defender su computadora de toda esa salida malvada, hasta que alcanza otro número que es divisible por 5 (o 15, ya que también son divisibles por 5). Lo que eso significa es que hasta que tenga que imprimir Buzz(o FizzBuzz) nuevamente, no imprime nada en absoluto.

Cuando finalmente alcanzas esa condición, Buzz se va:

To infinity and beyond!

Salida de ejemplo

Este es el resultado esperado para n = 25: (observe cómo se salta de 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

Reglas

Nueva línea final opcional es aceptable.

Este es el código de golf; como tal, el código más corto, en bytes, gana.

Suponga que lo dado nes válido y mayor o igual a 15 (que es cuando el desafío se desvía por primera vez del fizzbuzz estándar)

Buzz te saluda cuando el "contador de Buzz" (que cuenta ambos Buzzy FizzBuzz) golpea 3; él sale cuando se imprime el siguiente Buzz(incluyendo, nuevamente, ambos Buzzy FizzBuzz).

El número en el que sale no cuenta para el próximo "contador de zumbidos"; en su lugar, debe comenzar a contar los Buzzes nuevamente desde 0. Por ejemplo, un programa que se ejecuta con n = 25(salida de ejemplo) debe terminar con un "Contador de zumbidos" de 1, ya que esa es la cantidad de veces que Buzzse imprimió desde la última vez que se fue.

En caso de que ncaiga entre una de las llegadas de Buzz y una de sus salidas (es decir, él todavía está allí, no está imprimiendo nada), se espera una terminación elegante. Por lo tanto, la última línea de salida sería su introducción.

Las lagunas estándar están prohibidas.

osuka_
fuente
1
¿Puedes aclarar el comportamiento esperado cuando ncae entre la llegada de Buzz Lightyear y su partida?
nderscore
Simplemente salga del programa.
Editaré

Respuestas:

5

Javascript (ES6), 182 175 bytes

  • -7 bytes : Se movió la lógica de Buzz Lightyear a la expresión ternaria de 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
fuente
3

Python 2 , 185 178 172 bytes

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

Pruébalo en línea!

Explicación

Observar: Buzz Lightyear llega al tercer "número de zumbido" y sale en el cuarto. Los "números de zumbido" son múltiplos de cinco. Por lo tanto, los movimientos de Buzz suceden en un ciclo de longitud 20.

Hacemos un ciclo de cada uno ide 0 a través de input-1. (Esto significa que isiempre es uno menos que el número real que estamos considerando).

Utilizando -~icomo acceso directo para i+1, if-~i%20<16:comprueba si i+1, mod 20, es 15 o menos. (Si son de 16 a 19, Buzz Lightyear está presente y no queremos generar nada).

Dentro de la declaración if, queremos imprimir To infinity and beyond!en cada múltiplo de 20, es decir, cada vez i%20es 19. (Recuerde que ies uno menos que el número real). Dado i%20que nunca será mayor que 19, i%20/19será 1 en el deseado caso, <1 de lo contrario. Python 2, convenientemente, trunca los flotadores cuando se multiplica por cadenas, por lo que i%20/19*"..."da la cadena completa si i%20es 19, de lo contrario "".

Si se aplica el caso anterior, no imprimimos nada más. Pero si la primera expresión es ""(que es falsa), usamos orpara continuar. Las expresiones para Fizz, Buzzy la introducción se calculan de manera similar a la anterior y se suman.

Finalmente, si ninguno de estos casos aplica, imprimimos el número mismo con -~i.

DLosc
fuente
2

05AB1E , 97 93 90 bytes

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

Pruébalo en línea!

Explicación por venir después de más golf.

Versión alternativa de 97 bytes

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