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 n
e imprima FizzBuzz
para qualquer número divisível por 15, Fizz
para qualquer número divisível por 3 e Buzz
para qualquer número divisível por 5, até (e inclusive) n
. A saída para todos i
deve 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 Buzz
ou 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 FizzBuzz
contará para a sua Buzz
contagem .
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 Buzz
e FizzBuzz
) atinge 3; ele parte quando o próximo Buzz
(incluindo, novamente, ambos Buzz
e 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 Buzz
es 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 Buzz
foi impresso desde a última vez em que ele partiu.
Caso n
ocorra 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.
n
fica entre a chegada de Buzz Lightyear e sua partida?Respostas:
Javascript (ES6),
182175 bytesfonte
Python 2 ,
185178172 bytesExperimente 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
i
de 0 até a entrada-1. (Isso significa quei
é sempre um a menos que o número real que estamos considerando.)Utilizando
-~i
como atalho parai+1
,if-~i%20<16:
verifica se oi+1
mod 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 quei%20
for 19. (Lembre-se de quei
é um a menos que o número real.) Comoi%20
nunca será maior que 19,i%20/19
será 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 sei%20
for 19, caso contrário""
.Se o caso acima se aplicar, não imprimimos mais nada. Mas se a primeira expressão é
""
(o que é falso), usamosor
para continuar. As expressões paraFizz
,Buzz
e 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
.fonte
05AB1E ,
979390 bytesExperimente online!
Explicação a seguir após mais golfe.
Versão alternativa de 97 bytes
fonte