Fizz Buzz Lightyear

9

À la suite des nombreux (deux?) Défis liés à FizzBuzz publiés récemment sur PPCG, j'ai été tenté de créer le mien. Voir...

Fizz Buzz Lightyear

Écrivez un programme ou une fonction qui prend un entier net s'imprime FizzBuzzpour tout nombre divisible par 15, Fizzpour tout nombre divisible par 3 et Buzzpour tout nombre divisible par 5, jusqu'à (et y compris) n. La sortie pour tous idoit être suivie d'une nouvelle ligne. Mais il y a une torsion!

Pour chaque troisième fois que vous imprimez Buzz, Buzz Lightyear tient enfin compte de votre appel et se bloque dans votre programme. Il se présente ensuite - mais depuis qu'il s'est écrasé, une partie de ce qu'il a dit se confond avec la sortie de votre programme:

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

(c'est-à-dire, ajoutez uniquement  Lightyear, Space Ranger, Universe Protection Unit.à Buzzou FizzBuzz- quoi que ce soit que vous auriez affiché autrement. Notez l'espace de tête)

Cependant, Buzz Lightyear, étant le Space Ranger qu'il est, a une audition très aiguë, et donc l' impression FizzBuzzcomptera pour votre Buzzcompte .

Ensuite, Buzz traîne pour défendre votre ordinateur contre toutes ces sorties maléfiques, jusqu'à ce que vous atteigniez un autre nombre divisible par 5 (ou 15, car ceux-ci sont également divisibles par 5). Cela signifie que jusqu'à ce que vous deviez imprimer Buzz(ou FizzBuzz) à nouveau, vous n'imprimez rien du tout.

Lorsque vous atteignez enfin cette condition, Buzz part:

To infinity and beyond!

Exemple de sortie

Il s'agit de la sortie attendue pour n = 25: (remarquez comment elle saute de 16 à 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

Règles

Un retour à la ligne facultatif est acceptable.

C'est le golf de code; en tant que tel, le code le plus court, en octets, gagne.

Supposons que donné nest valide et supérieur ou égal à 15 (c'est-à-dire lorsque le défi s'écarte pour la première fois du fizzbuzz standard)

Buzz vous salue lorsque le "compteur Buzz" (qui compte à la fois Buzzet FizzBuzz) atteint 3; il part lorsque le suivant Buzz(y compris, encore une fois, les deux Buzzet FizzBuzz) est imprimé.

Le nombre dans lequel il part ne compte pas pour le prochain "Buzz counter"; vous devriez plutôt recommencer à compter les Buzzes à partir de 0. Par exemple, un programme fonctionnant avec n = 25(exemple de sortie) devrait se terminer par un "compteur de buzz" de 1, car c'est le nombre de fois qui a Buzzété imprimé depuis le dernier départ.

En cas de nchute entre l'un des arrivées de Buzz et l'un de ses départs (c'est-à-dire qu'il est toujours là - vous n'imprimez rien), une résiliation gracieuse est attendue. Par conséquent, la dernière ligne de sortie serait son introduction

Les failles standard sont interdites.

osuka_
la source
1
Pouvez-vous clarifier le comportement attendu lors d'une nchute entre l'arrivée de Buzz Lightyear et son départ?
nderscore
Quittez simplement le programme. Je modifierai les règles dans une seconde
osuka_

Réponses:

5

Javascript (ES6), 182 175 octets

  • -7 octets : Déplacement de la logique Buzz Lightyear dans l'expression ternaire 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
la source
3

Python 2 , 185 178 178 172 octets

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

Essayez-le en ligne!

Explication

Observez: Buzz Lightyear arrive sur le troisième "numéro de buzz" et part sur le quatrième. Les «numéros de buzz» sont les multiples de cinq. Ainsi, les mouvements de Buzz se produisent sur un cycle de longueur 20.

Nous bouclons chacun ide 0 à l'entrée-1. (Cela signifie que ic'est toujours un de moins que le nombre réel que nous considérons.)

Utilisé -~icomme raccourci pour i+1, if-~i%20<16:vérifie si i+1, mod 20, est 15 ou moins. (Si c'est 16 à 19, Buzz Lightyear est présent et nous ne voulons rien produire.)

À l'intérieur de l'instruction if, nous voulons imprimer To infinity and beyond!sur chaque multiple de 20 - c'est-à-dire, chaque fois i%20est 19. (N'oubliez pas que ic'est un de moins que le nombre réel.) Puisque i%20ne sera jamais supérieur à 19, i%20/19sera 1 dans le nombre souhaité cas, <1 sinon. Python 2, commodément, tronque les flottants lors de la multiplication par des chaînes, donc i%20/19*"..."donne la chaîne complète si elle i%20est 19, sinon "".

Si le cas ci-dessus s'applique, nous n'imprimons rien d'autre. Mais si la première expression est ""(qui est fausse), nous utilisons orpour continuer. Les expressions pour Fizz, Buzzet l'introduction sont calculées de la même manière que ci-dessus et ajoutées ensemble.

Enfin, si aucun de ces cas ne s'applique, nous imprimons le numéro lui-même avec -~i.

DLosc
la source
2

05AB1E , 97 93 90 octets

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

Essayez-le en ligne!

Explication à venir après un nouveau golf.

Version alternative à 97 octets

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