Fizz Buzz Lightyear


9

Após os muitos (dois?) Desafios relacionados ao FizzBuzz publicados recentemente no PPCG, fiquei tentado a criar o meu. Contemplar...

Fizz Buzz Lightyear

Escreva um programa ou função que utilize um número inteiro ne imprima FizzBuzzpara qualquer número divisível por 15, Fizzpara qualquer número divisível por 3 e Buzzpara qualquer número divisível por 5, até (e inclusive) n. A saída para todos ideve ser seguida por uma nova linha. Mas há uma torção!

Pela terceira vez que você imprime Buzz, o Buzz Lightyear finalmente atende à sua chamada e falha no seu programa. Ele então se apresenta - mas desde que ele caiu, parte do que ele disse se confunde com a saída do seu programa:

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

(ou seja, apenas anexar  Lightyear, Space Ranger, Universe Protection Unit.a Buzzou FizzBuzz- tudo o que você teria mostrado o contrário Observe o espaço à esquerda.)

No entanto, Buzz Lightyear, sendo o Space Ranger que ele é, tem uma audição muito aguda e, portanto, a impressão FizzBuzzcontará para a sua Buzzcontagem .

Então, o Buzz fica por aqui para defender seu computador de toda essa saída ruim, até você atingir outro número que é divisível por 5 (ou 15, pois esses também são divisíveis por 5). O que isso significa é que, até que você precise imprimir Buzz(ou FizzBuzz) novamente, você não imprime nada.

Quando você finalmente atinge essa condição, o Buzz parte:

To infinity and beyond!

Saída de exemplo

Esta é a saída esperada para n = 25: (observe como pula 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

Regras

A nova linha à direita opcional é aceitável.

Isso é código de golfe; como tal, o código mais curto, em bytes, vence.

Suponha que dado né válido e maior ou igual a 15 (que é quando o desafio se desvia do fizzbuzz padrão)

O Google Buzz recebe você quando o "contador de Buzz" (que conta ambos Buzze FizzBuzz) atinge 3; ele parte quando o próximo Buzz(incluindo, novamente, ambos Buzze FizzBuzz) é impresso.

O número em que ele parte não conta para o próximo "contador de buzz"; você deve começar a contar os Buzzes novamente a partir de 0. Por exemplo, um programa em execução com n = 25(exemplo de saída) deve terminar com um "contador de buzz" igual a 1, pois é quantas vezes Buzzfoi impresso desde a última vez em que ele partiu.

Caso nocorra entre uma das chegadas de Buzz e uma de suas saídas (ou seja, ele ainda está lá - você não está imprimindo nada), espera-se um término gracioso. Portanto, a última linha de saída seria sua introdução

As brechas padrão são proibidas.


11
Você pode esclarecer o comportamento esperado quando nfica entre a chegada de Buzz Lightyear e sua partida?
Ndscore 22/02

Simplesmente saia do programa. Vou editar as regras em um segundo
osuka_ 22/02

Respostas:


5

Javascript (ES6), 182 175 bytes

  • -7 bytes : moveu a lógica do Buzz Lightyear para a expressão ternária do 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 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

Experimente online!

Explicação

Observe: o Buzz Lightyear chega no terceiro "número de buzz" e parte no quarto. "Números de buzz" são múltiplos de cinco. Assim, os movimentos do Buzz acontecem em um ciclo de duração 20.

Passamos cada um ide 0 até a entrada-1. (Isso significa que ié sempre um a menos que o número real que estamos considerando.)

Utilizando -~icomo atalho para i+1, if-~i%20<16:verifica se o i+1mod 20 é 15 ou menos. (Se são 16 a 19, o Buzz Lightyear está presente e não queremos produzir nada.)

Dentro da instrução if, queremos imprimir To infinity and beyond!todo múltiplo de 20 - ou seja, toda vez que i%20for 19. (Lembre-se de que ié um a menos que o número real.) Como i%20nunca será maior que 19, i%20/19será 1 no número desejado. caso, <1 caso contrário. O Python 2, convenientemente, trunca os flutuadores ao multiplicar por seqüências de caracteres, i%20/19*"..."fornecendo a sequência completa se i%20for 19, caso contrário "".

Se o caso acima se aplicar, não imprimimos mais nada. Mas se a primeira expressão é ""(o que é falso), usamos orpara continuar. As expressões para Fizz, Buzze a introdução são calculadas de forma semelhante à anterior e adicionadas juntas.

Finalmente, se nenhum desses casos se aplicar, imprimimos o próprio número com -~i.


2

05AB1E , 97 93 90 bytes

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

Experimente online!

Explicação a seguir após mais golfe.

Versão alternativa de 97 bytes

>G"FizzBuzz"2ä” Lightyear,‡²ìÓ,ªÜŠí‰¿.”)˜N•9¨•3äR%15%_ÏJ“To infinity€ƒ—°!“)N20ÖèN)˜é®èN20%15›i\},
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.