Au Scrabble, chaque lettre vaut un certain nombre de points
Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 5 — Les dictionnaires · Applications
Énoncé
Au Scrabble, chaque lettre vaut un certain nombre de points. Construire la table des lettres sans écrire lignes, puis score(mot).
Corrigé
VALEURS = {}
for lettres, points in [("eaionrtlsu", 1), ("dg", 2), ("bcmp", 3),
("fhvwy", 4), ("jx", 8), ("kqz", 10)]:
for lettre in lettres:
VALEURS[lettre] = points
def score(mot, valeurs=VALEURS):
"""Score d'un mot. Precondition : toutes les lettres sont dans la table."""
mot = mot.lower()
for c in mot:
assert c in valeurs, "lettre hors table : " + c
return sum(valeurs[c] for c in mot)
La construction par groupes. Les lettres sont rangées par valeur, ce qui est la façon dont la règle du jeu les présente ; la double boucle retourne cette organisation en un dictionnaire lettre par lettre. Écrire les vingt-six entrées à la main serait plus long et, surtout, ne se relirait pas : ici, une lettre oubliée se voit.
La vérification qui compte le plus n'est pas un score, c'est len(VALEURS) == 26. Elle contrôle qu'aucune lettre n'a été oubliée ni écrite deux fois — un doublon donnerait moins de entrées, et la dernière valeur écraserait silencieusement la première.
Vérification.
assert len(VALEURS) == 26
assert score("chat") == 3 + 4 + 1 + 1 == 9
assert score("jazz") == 8 + 1 + 10 + 10 == 29
assert score("") == 0
assert score("KAYAK") == 10 + 1 + 4 + 1 + 10 == 26
try:
score("ch4t")
assert False
except AssertionError as e:
assert "hors table" in str(e)
Écrire 9 et 3 + 4 + 1 + 1 dans le même assert documente le calcul en même temps qu'il le teste.
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.