Corrigé : pendu
Corrigé de la question 1. Fonction est_une_lettre(lettre, mot)
tests de est_une_lettre(lettre, mot)
Commençons par les tests. Ils vous étaient donnés dans l'énoncé. Il suffisait de les écrire. Par exemple :
def test_est_une_lettre():
    assert est_une_lettre("i", "victoire")
    assert not est_une_lettre("e", "la disparition")Pas besoin d'écrire assert est_une_lettre("i", "victoire") == True, c'est équivalent à assert est_une_lettre("i", "victoire").
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 FalseOn 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 FalseNotez 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 motCorrigé de la question 2. Fonction caractères(lettre, mot)
tests de caractères(lettre, mot)
Encore une fois les tests étaient donnés. Il suffisait de les re-écrire :
def test_caractères():
    assert [1, 5] == caractères("i", "victoire")
    assert [] == caractères("e", "la disparition")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 positionOn 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)
tests de découvre(mot_caché, lettre, positions)
Comme d'habitude, les tests étaient donnés dans l'énoncé :
def test_découvre():
    assert ".rr..r" == découvre("......", "r", [1, 2, 5])
    assert "erreur" == découvre("erre.r", "u", [4])
    assert "erre.r" == découvre("erre.r", "u", [])
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 motEn 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)
Comme toujours, les tests sont donnés dans l'énoncé :
def test_caché():
    assert "" == caché("")
    assert "........................." == caché("anticonstitutionnellement")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)
test_pendu.py
from pendu import est_une_lettre, caractères, découvre, caché
def test_est_une_lettre():
    assert est_une_lettre("i", "victoire")
    assert not est_une_lettre("e", "la disparition")
def test_caractères():
    assert [1, 5] == caractères("i", "victoire")
    assert [] == caractères("e", "la disparition")
def test_découvre():
    assert ".rr..r" == découvre("......", "r", [1, 2, 5])
    assert "erreur" == découvre("erre.r", "u", [4])
    assert "erre.r" == découvre("erre.r", "u", [])
def test_caché():
    assert "" == caché("")
    assert "........................." == caché("anticonstitutionnellement")
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.")
Fichiers
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)
test_pendu.py
from pendu import est_une_lettre, caractères, découvre, caché
def test_est_une_lettre():
    assert est_une_lettre("i", "victoire")
    assert not est_une_lettre("e", "la disparition")
def test_caractères():
    assert [1, 5] == caractères("i", "victoire")
    assert [] == caractères("e", "la disparition")
def test_découvre():
    assert ".rr..r" == découvre("......", "r", [1, 2, 5])
    assert "erreur" == découvre("erre.r", "u", [4])
    assert "erre.r" == découvre("erre.r", "u", [])
def test_caché():
    assert "" == caché("")
    assert "........................." == caché("anticonstitutionnellement")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.")