Adloun

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.