Aller au contenu

Trouver les lettres manquantes dans un pangramme⚓︎

Un pangramme est une phrase contenant toutes les lettres de l'alphabet.

Il existe dans l'alphabet latin utilisé en français 26 lettre minuscules « classiques ». Si l'on tient compte des lettres accentuées et des ligatures (à, â, ..., ç, æ et œ), le décompte passe à 42 caractères distincts.

On se limite dans cet exercice aux lettres minuscules de l'alphabet : a, b, c, ..., z.

Un exemple classique de pangramme est « portez ce vieux whisky au juge blond qui fume ». Chaque lettre y apparaît au moins une fois.

Par contre « portez un vieux whisky au juge blond qui fume » n'est pas un pangramme : il manque la lettre c.

Vous devez écrire trois fonctions :

  • indice prend en argument une lettre minuscule entre "a" et "z" et renvoie son indice dans l'alphabet (en débutant à 0 pour "a") ;
  • minuscule prend en argument un indice entre 0 et 25 (inclus l'un et l'autre) et renvoie la lettre de l'alphabet correspondante (minuscule(1) renvoie "b") ;
  • lettres_manquantes qui :
    • prend en argument une chaîne de caractères phrase,
    • renvoie la liste des lettres manquantes dans cette chaîne pour qu'elle soit un pangramme.

On prendra soin de renvoyer les lettres manquantes dans l'ordre alphabétique.

Exemples

🐍 Console Python
>>> indice("a")
0
>>> indice("z")
25
>>> minuscule(1)
'b'
>>> minuscule(24)
'y'
🐍 Console Python
>>> lettres_manquantes("portez ce vieux whisky au juge blond qui fume !")
[]
>>> lettres_manquantes("portez un vieux whisky au juge blond qui fume !")
['c']
>>> lettres_manquantes("portez ce vieux whisky au juge blond !")
['f', 'm', 'q']
Indice

On pourra utiliser une liste presences contenant initialement 26 fois la valeur False. Cette liste sera mise à jour lors d'un parcours de la chaîne de caractères : lorsque l'on rencontre une lettre, on met True dans la cellule correspondante.

Une fois la phrase lue en entier, les lettres manquantes peuvent être déterminées en parcourant la liste de booléens.

# Testsbksl-nlassert indice("a") == 0bksl-nlassert indice("z") == 25bksl-nlassert minuscule(1) == "b"bksl-nlassert minuscule(24) == "y"bksl-nlassert lettrespy-undmanquantes("portez ce vieux whisky au juge blond qui fume !") == []bksl-nlassert lettrespy-undmanquantes("portez un vieux whisky au juge blond qui fume !") == ["c"]bksl-nlassert lettrespy-undmanquantes("portez ce vieux whisky au juge blond !") == ["f", "m", "q"]bksl-nlbksl-nl# Tests supplémentairesbksl-nlimport stringbksl-nlbksl-nlalphabet = list(string.asciipy-undlowercase)bksl-nlfor i, lettre in enumerate(alphabet):bksl-nl assert indice(lettre) == ibksl-nl assert minuscule(i) == lettrebksl-nlassert lettrespy-undmanquantes("a") == alphabet[1:]bksl-nlassert lettrespy-undmanquantes("") == alphabetbksl-nlassert lettrespy-undmanquantes(" ".join(alphabet[2:])) == ["a", "b"]bksl-nlassert lettrespy-undmanquantes(", ".join(alphabet)) == []bksl-nlbksl-nl ∞/∞

def indice(minsucule):bksl-nl return ord(...) - ord(...)bksl-nlbksl-nlbksl-nldef minuscule(i):bksl-nl return chr(ord(...) + ...)bksl-nlbksl-nlbksl-nldef lettrespy-undmanquantes(phrase):bksl-nl presences = [...] py-str ...bksl-nl for caractere in phrase:bksl-nl if "a" <= caractere <= ...:bksl-nl presences[...] = Truebksl-nlbksl-nl resultat = []bksl-nl for i in range(...):bksl-nl if ...:bksl-nl resultat.append(...)bksl-nlbksl-nl return resultatbksl-nlbksl-nlbksl-nl# Testsbksl-nlassert indice("a") == 0bksl-nlassert indice("z") == 25bksl-nlassert minuscule(1) == "b"bksl-nlassert minuscule(24) == "y"bksl-nlassert lettrespy-undmanquantes("portez ce vieux whisky au juge blond qui fume !") == []bksl-nlassert lettrespy-undmanquantes("portez un vieux whisky au juge blond qui fume !") == ["c"]bksl-nlassert lettrespy-undmanquantes("portez ce vieux whisky au juge blond !") == ["f", "m", "q"]bksl-nlbksl-nldef indice(minuscule):bksl-nl return ord(minuscule) - ord("a")bksl-nlbksl-nlbksl-nldef minuscule(i):bksl-nl return chr(ord("a") + i)bksl-nlbksl-nlbksl-nldef lettrespy-undmanquantes(phrase):bksl-nl presences = [False] py-str 26bksl-nl for caractere in phrase:bksl-nl if "a" <= caractere <= "z":bksl-nl presences[indice(caractere)] = Truebksl-nlbksl-nl resultat = []bksl-nl for i in range(26):bksl-nl if not presences[i]:bksl-nl resultat.append(minuscule(i))bksl-nlbksl-nl return resultatbksl-nlbksl-nlbksl-nl# Testsbksl-nlassert indice("a") == 0bksl-nlassert indice("z") == 25bksl-nlassert minuscule(1) == "b"bksl-nlassert minuscule(24) == "y"bksl-nlassert lettrespy-undmanquantes("portez ce vieux whisky au juge blond qui fume !") == []bksl-nlassert lettrespy-undmanquantes("portez un vieux whisky au juge blond qui fume !") == ["c"]bksl-nlassert lettrespy-undmanquantes("portez ce vieux whisky au juge blond !") == ["f", "m", "q"]bksl-nlbksl-nl

A

Commentaires⚓︎

{{ IDE('exo_corr') }}

La fonction indice permet de mettre en correspondance chaque lettre avec un indice dans le tableau.

On utilise pour cela le code ASCII de chaque lettre. Dans la table ASCII, les lettres latines en minuscule sont à la suite et dans l'ordre alphabétique. Ainsi ord("b") - ord("a") renvoie 1 ce qui permet d'accéder à la bonne case du tableau.

La fonction réciproque minuscule utilise chr.

Avec un ensemble⚓︎

La structure d'ensemble de Python est aussi adaptée ici :

🐍 Script Python
def lettres_manquantes(phrase):
    lettres = {minuscule(i) for i in range(26)}
    for caractere in phrase:
        lettres.discard(caractere)
    return sorted(list(lettres))

Il faut toutefois être attentif à deux points :

  • la méthode remove d'un ensemble Python lève une erreur si la valeur à retirer n'est pas présente. Ce n'est pas le cas de discard ;
  • les éléments d'un ensemble ne sont pas triés. On doit renvoyer le résultat trié de la conversion : sorted(list(lettres)).

Z

Retour en haut de la page