Adloun

FizzBuzz, et le piège de l'ordre

Exercice de TD · niveau 2 · sciences numériques et technologie (seconde), chapitre 7 — Projets et mini-jeux · Motifs et FizzBuzz

Énoncé

  1. Un élève écrit la version ci-dessous. Donner sa sortie pour , puis expliquer.
for i in range(1, 21):
    if i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    elif i % 15 == 0:
        print("FizzBuzz")
    else:
        print(i)
  1. Écrire une version sans tester , en construisant la chaîne à afficher.
  2. Généraliser en fizzbuzz(n, regles)regles est une liste de couples (diviseur, mot).

Corrigé

1. Pour , elle affiche Fizz, et jamais FizzBuzz.

est multiple de : la première condition est vraie, la branche est prise, et les elif suivants ne sont jamais atteints. La troisième condition est du code mort — aucun nombre ne peut y parvenir, puisque tout multiple de est déjà multiple de . Quand des conditions s'emboîtent, la plus restrictive passe en premier.

2. En construisant la chaîne, le problème disparaît :

for i in range(1, 21):
    mot = ""
    if i % 3 == 0:
        mot = mot + "Fizz"
    if i % 5 == 0:
        mot = mot + "Buzz"
    print(mot if mot else i)

Ici les deux if sont indépendants : traverse les deux et donne FizzBuzz par concaténation. Le cas particulier n'a plus à être écrit — il découle de la règle.

3. La version générale :

def fizzbuzz(n, regles):
    for i in range(1, n + 1):
        mot = ""
        for d, m in regles:
            if i % d == 0:
                mot = mot + m
        print(mot if mot else i)

fizzbuzz(20, [(3, "Fizz"), (5, "Buzz")])
fizzbuzz(30, [(3, "Fizz"), (5, "Buzz"), (7, "Bazz")])

Ajouter une règle ne demande plus de toucher au code : c'est le signe qu'on a trouvé la bonne structure.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.