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.