Corrigé : pendu
Corrigé de la question 1. Fonction est_une_lettre(lettre, mot)
Plusieurs possibilités. Commençons par la plus simple, que tout le monde devrait arriver à faire, c'est une retranscription directe d'un algorithme du cours :
def est_une_lettre(lettre, mot):
for c in mot:
if lettre == c:
return True
return False
On pouvait aussi utiliser le mot clé in de python (supposé connu de tous), pour une solution écrite en 30 secondes chrono :
def est_une_lettre(lettre, mot):
if lettre in mot:
return True
else:
return False
Notez que la version précédente est identique à la version ci-dessous, bien plus élégante :
def est_une_lettre(lettre, mot):
return lettre in mot
Corrigé de la question 2. Fonction caractères(lettre, mot)
def caractères(lettre, mot):
position = []
for i in range(len(mot)):
if mot[i] == lettre:
position.append(i)
return position
On utilise ici la fonction range pour itérer sur les indices du tableau plutôt que sur ses valeurs.
Encore une fois, tout le monde devrait arriver à faire cette fonction d'une seule traite, sans réfléchir.
Corrigé de la question 3. Fonction découvre(mot_caché, lettre, positions)
La fonction que j'attends est :
def découvre(mot_caché, lettre, positions):
mot = ""
for i in range(len(mot_caché)):
if i in positions:
mot += lettre
else:
mot += mot_caché[i]
return mot
En utilisant les caractéristiques de la liste positions trié par ordre croissant, on aurait pu forger la fonction ci-dessous de complexité $\mathcal{O}(n)$ (pourquoi est-ce que ça marche ?):
def découvre(mot_caché, lettre, positions):
mot = ""
if len(positions) == 0:
return mot_caché
pos = 0
for i in range(len(mot_caché)):
if i == positions[pos]:
mot += lettre
pos = min(pos + 1, len(positions) - 1)
else:
mot += mot_caché[i]
return mot
Corrigé de la question 4. Fonction caché(mot)
En utilisant la multiplications des chaînes de caractères, la fonction est triviale :
def caché(mot):
return "." * len(mot)
Corrigé de la question 5. Programme principal
Une proposition de programme principal :
mot_à_trouver = "table"
mot_caché = caché(mot_à_trouver)
print("mot à trouver :", mot_caché)
nombre_essai = 0
while est_une_lettre(".", mot_caché):
lettre = input("Donnez une lettre : ")
mot_caché = découvre(mot_caché, lettre, caractères(lettre, mot_à_trouver))
print("mot à trouver :", mot_caché)
nombre_essai += 1
print("Victoire !, vous avez gagné en", nombre_essai, "essais.")
Fichiers finaux
pendu.py
def est_une_lettre(lettre, mot):
return lettre in mot
def caractères(lettre, mot):
position = []
for i in range(len(mot)):
if mot[i] == lettre:
position.append(i)
return position
def découvre(mot_caché, lettre, positions):
mot = ""
for i in range(len(mot_caché)):
if i in positions:
mot += lettre
else:
mot += mot_caché[i]
return mot
def caché(mot):
return "." * len(mot)
main.py
from pendu import caché, est_une_lettre, découvre, caractères
mot_à_trouver = "table"
mot_caché = caché(mot_à_trouver)
print("mot à trouver :", mot_caché)
nombre_essai = 0
while est_une_lettre(".", mot_caché):
lettre = input("Donnez une lettre : ")
mot_caché = découvre(mot_caché, lettre, caractères(lettre, mot_à_trouver))
print("mot à trouver :", mot_caché)
nombre_essai += 1
print("Victoire !, vous avez gagné en", nombre_essai, "essais.")