Créer un programme «BizzFuzz»

17

Dans FizzBuzz traditionnel, vous êtes invité à imprimer les nombres de 1 à 100, mais en remplaçant chaque multiple de 3 par "Fizz", chaque multiple de 5 par "Buzz" et chaque multiple de 3 et 5 (c.-à-d. 15) par " FizzBuzz ".

Cependant, en tant qu'intervieweur diabolique, j'ai inventé ma propre version tordue de FizzBuzz, que j'ai décidé de nommer BizzFuzz et de vous donner dans une interview de codage.

Les règles du jeu sont les suivantes:

  • Imprimez chaque numéro de 1 à 100, sauf si le numéro remplit l'une des conditions ci-dessous.

    • Si le nombre est divisible par 4, imprimez "Fizz".
    • Si le nombre est divisible par 5, imprimez "Buzz".

    • Si le nombre est divisible par 4, mais que le nombre immédiatement après est divisible par 5, imprimez "FizzBuzz" au lieu de "Fizz" et imprimez régulièrement le numéro suivant.

    • Si le nombre est divisible par 5, mais que le nombre immédiatement après est divisible par 4, imprimez "BuzzFizz" au lieu de "Buzz" et imprimez régulièrement le numéro suivant.

    • Si le nombre est immédiatement avant un nombre divisible par 4 et 5, imprimez "Bizz".

    • Si le nombre est immédiatement après un nombre divisible par 4 et 5, imprimez "Fuzz".

    • Si le nombre est divisible par 4 et 5, imprimez "BizzFuzz".

Le code le plus court pour implémenter toutes ces règles dans n'importe quelle langue l'emporte.

Joe Z.
la source

Réponses:

4

GolfScript ( 83 80 caractères)

(La suggestion de NB Howard dans les commentaires permet de réduire à 78 caractères, mais avec des espaces de fin sur certaines lignes).

Cela utilise le caractère \0, donc ici, il est au format xxd:

0000000: 3130 302c 7b29 2e32 3025 2742 6946 750a  100,{).20%'BiFu.
0000010: 0046 750a 0000 0046 6942 750a 0000 0000  .Fu....FiBu.....
0000020: 4669 0a00 0042 750a 0000 4669 0a00 0000  Fi...Bu...Fi....
0000030: 4275 4669 0a00 0000 0042 690a 2731 2c2f  BuFi.....Bi.'1,/
0000040: 3d32 2f27 7a7a 272a 5c6e 2b6f 727d 2f0a  =2/'zz'*\n+or}/.

et base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

En utilisant ^ comme substitut \0, c'est

100, {) .20% 'BiFu
 ^ Fu
 ^ ^ ^ FiBu
 ^ ^ ^ ^ Fi
 ^ ^ Bu
 ^ ^ Fi
 ^ ^ ^ BuFi
 ^ ^ ^ ^ Bi
'1, / = 2 /' zz '* \ n + ou} /

Ce n'est toujours pas un problème particulièrement intéressant.


Une explication a été demandée:

Pour les valeurs 0à 99inclure:

100,{
...
}/

Incrémenter la valeur (nous voulons 1à 100) et trouver aussi ce que la valeur incrémentée est mod 20:

).20%

Divisez la chaîne magique autour des \0caractères:

MAGIC_STRING 1,/

Prenez le ( x mod 20) ème élément de ce tableau, divisez-le en morceaux de 2 caractères et collez-les avec zz. Remarque: la chaîne est soit vide (dans ce cas, il n'y a pas de morceaux, donc nous nous retrouvons avec la chaîne vide) ou est une séquence de [BF][iu]préfixes suivie d'une nouvelle ligne.

=2/'zz'*

Prenez l'autre copie du numéro incrémenté que nous avons conservé sur la pile et ajoutez une nouvelle ligne. Maintenant, quelle que soit la chaîne que nous conservons se terminera par une nouvelle ligne.

\n+

Appliquez une opération de secours. (Ceci est similaire à ||JavaScript ou COALESCEà SQL).

or
Peter Taylor
la source
@minitech, typo introduite en ne copiant-collant pas car tout réindenter est pénible. Fixé.
Peter Taylor
2
tout réindenter = CTRL + K
John Dvorak
Pouvez-vous expliquer cela?
Johannes Kuhn
"Pas un problème très intéressant." Ouais, j'avais une intuition qui était le cas quand je l'ai posté. Pourtant, c'est une variation.
Joe Z.
Il devient également plus intéressant en tant que jeu de société avec des amis plutôt qu'en tant que défi de programmation. À tour de rôle, essayez de dire les chiffres dans l'ordre. Il s'agit essentiellement de FizzBuzz Hardcore Edition si vous ne mémorisez pas la séquence à l'avance.
Joe Z.
13

Python, 114

a='Fizz'
b='Buzz'
c='Bizz'
d='Fuzz'
e=c+d
f=a+b
g=b+a
i=1
exec"print eval('ediifiiiaibiaiigiiic'[i%20]);i+=1;"*100

Solution originale ( 131 ):

f='Fizz'
for i in range(1,101):x=i%20;print('Bizz'*(x%19<1)+'Fuzz'*(x<2)or(i%4<1)*f+'Buzz'*(i%5<1or x==4)+f*(x==15)or i,i)[x%11==5]
grc
la source
3
Un très bel abus d'eval
3

Python 2, 131

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):print{5:Z,19:I,i%4:B,i%5*4:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(i%4+i%5*4,i)
Ry-
la source
1
Vous pouvez jouer au golf jusqu'à 154 en utilisant a) un court-circuit logique sur l'expression à imprimer, b) inverser le sens de rle calculer en moins de caractères, c) tout mettre sur une seule ligne:r,F,B,Z,I=1,'Fizz','Buzz','Fuzz','Bizz'\nfor i in range(1,101):a,b=i%4,i%5*4;print~-r and i or{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i);r=3!=a+b!=16
Rétablir Monica
@WolframH: Merci! J'ai appliqué ceux avec quelques changements pour en faire 143.
Ry-
Ok, ça m'a fait battre, un travail impressionnant. J'adore print 1!=a+b!=4c'est diabolique!
1
@LegoStormtroopr: Non. Le exec/ evalcombo est diabolique;)
Ry-
Ouais, ça va être difficile à battre. J'ai réussi à presser et à en former quelques-unes supplémentaires en changeant la section d'impression enprint{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(a+b,i)
1

Une implémentation de référence non golfée en Python qui implémente littéralement chaque règle (420 caractères):

n = 1
while(n <= 100):
    if(n % 20 == 0):
        print "BizzFuzz"
    elif((n - 1) % 20 == 0):
        print "Fuzz"
    elif((n + 1) % 20 == 0):
        print "Bizz"
    elif(n % 5 == 0 and (n + 1) % 4 == 0):
        print "BuzzFizz"
        print n + 1
        n += 1
    elif(n % 4 == 0 and (n + 1) % 5 == 0):
        print "FizzBuzz"
        print n + 1
        n += 1
    elif(n % 4 == 0):
        print "Fizz"
    elif(n % 5 == 0):
        print "Buzz"
    else:
        print n
    n += 1
Joe Z.
la source
3
Hey. Vous avez des parenthèses dans mon Python.
Ry-
Je pense que l'IDE que j'utilisais les a insérés par défaut. J'étais sur une machine Windows et essayer de coder à l'aide d'un éditeur de texte sous Windows est brutal.
Joe Z.
1

Python, 150

Ceci est un dérivé de la réponse des minitechs (plus tôt), mais j'en ai assez pressé pour faire la mienne:

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):a,b=i%4,i%5*4;print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

La version dégolfée n'est pas beaucoup plus lisible, mais celle rque minitech utilisait n'est déclenchée que si à la prochaine itération la somme sia,b était soit 1,0ou 0,4, ce qui équivaut à i%4 or i%5 == 0ce qu'elle n'allait apparaître que dans ces circonstances. Il a donc été possible de supprimer l'affectation et le calcul de ret de les dériver de la valeur actuelle de l' iutilisation de aet b:

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):
 a,b=i%4,i%5*4;
 print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

Il comprend également les suggestions de @ WolframH.


la source
Euh, ce n'est pas vraiment différent. Quoi qu'il en soit, enlevez les espaces autour [1,4](et utilisez (1,4)ou en {1,4}plus) et avant {.
Ry-
Pas différent non, juste assez changé pour que je pense que ça valait le coup.
D'accord, mais vous devriez jouer au golf pour les espaces blancs.
Ry-
@minitech pas de soucis. Bravo pour la pointe sur l' []espacement. Je me demandais pourquoi vous l'avez utilisé {}dans votre réponse originale.
1

R: 170 caractères

a=b=1:100
o=!a%%4
i=!a%%5
w=o&i
a[o]="Fizz"
a[i]="Buzz"
a[c(i,F)&c(F,o)]="FizzBuzz"
a[c(F,i)&c(o,F)]="BuzzFizz"
a[w[-1]]="Bizz"
a[c(F,w)]="Fuzz"
a[w]="BizzFuzz"
cat(a[b])
plannapus
la source
0

Tcl, 185 caractères

while {[incr i]<101} {puts [expr {$i%4?$i%5?($i-1)%4|($i-1)%5?($i+1)%4|($i+1)%5?$i:"Fuzz":"Bizz":($i-1)%4?($i+1)%4?"Buzz":"BuzzFizz":$i:($i-1)%5?($i+1)%5?$i%5?"Fizz":"FizzBuzz":$i:$i}]}
Johannes Kuhn
la source
Parfois, les whileboucles peuvent être remplacées par des timeconstructions pour économiser des octets
sergiol