Adloun

Un jeu à cinq coups : pierre-feuille-ciseaux-lézard-Spock

Exercice supplémentaire · niveau 3 (difficile) · sciences numériques et technologie (seconde), chapitre 7 — Projets et mini-jeux · Pierre-feuille-ciseaux

Énoncé

Le jeu se joue aussi à cinq signes, chacun battant exactement deux autres. Plutôt que d'énumérer dix conditions, coder les règles dans une structure de données et écrire une fonction gagne(a, b) qui la consulte.

Corrigé

BAT = {
    "pierre":  ["ciseaux", "lezard"],
    "feuille": ["pierre", "spock"],
    "ciseaux": ["feuille", "lezard"],
    "lezard":  ["feuille", "spock"],
    "spock":   ["ciseaux", "pierre"],
}

def gagne(a, b):
    return b in BAT[a]

print(gagne("spock", "ciseaux"))   # True
print(gagne("lezard", "pierre"))   # False

Le gain n'est pas la brièveté, c'est la vérifiabilité. Dix conditions enchaînées par or sont impossibles à relire ; une table se contrôle. On peut même faire vérifier au programme que les règles sont cohérentes :

assert all(len(v) == 2 for v in BAT.values())          # chacun bat 2 signes
assert sum(len(v) for v in BAT.values()) == 10         # 10 duels décisifs
assert not any(a in BAT[b] and b in BAT[a] for a in BAT for b in BAT[a])

La dernière ligne vérifie qu'aucune paire ne se bat mutuellement — une faute de saisie qu'aucune relecture ne repère à coup sûr. Séparer les règles du code qui les applique, c'est ce qui rend les règles contrôlables.

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.