Aller au contenu

Reconnaître 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 lettres minuscules « usuelles ». Si l'on tient compte des lettres accentuées et des ligatures (à, â, ..., ç, æ et œ), le décompte passe à 42 caractères minuscules distincts.

On se limite dans cet exercice aux lettres minuscules usuelles 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 une fonction est_pangramme qui :

  • prend en paramètre une chaîne de caractères phrase,
  • renvoie le booléen indiquant si cette chaîne est un pangramme ou non.

On fournit la fonction indice qui prend en argument une lettre entre "a" et "z" et renvoie son indice dans l'alphabet (en débutant à 0 pour "a"). Il n'est pas indispensable de l'utiliser.

Exemples
🐍 Console Python
>>> indice("a")
0
>>> indice("z")
25
>>> est_pangramme("portez ce vieux whisky au juge blond qui fume !")
True
>>> est_pangramme("portez un vieux whisky au juge blond qui fume !")
False
>>> est_pangramme("jugez que ce texte renferme l'alphabet, dix voyelles, k et w")
True
>>> est_pangramme("jugez que ce texte renferme l'alphabet, dix voyelles et w")
False
###
# Testsbksl-nlassert estpy-undpangramme("portez ce vieux whisky au juge blond qui fume !") == Truebksl-nlassert estpy-undpangramme("portez un vieux whisky au juge blond qui fume !") == Falsebksl-nlassert (bksl-nl estpy-undpangramme("jugez que ce texte renferme l'alphabet, dix voyelles, k et w")bksl-nl == Truebksl-nl)bksl-nlassert (bksl-nl estpy-undpangramme("jugez que ce texte renferme l'alphabet, dix voyelles et w") == Falsebksl-nl)bksl-nlbksl-nl# Tests supplémentairesbksl-nlfrom string import asciipy-undlowercasebksl-nlbksl-nlassert estpy-undpangramme("the quick brown fox jumps over The lazy dog.") == Truebksl-nlassert (bksl-nl estpy-undpangramme(bksl-nl "hier, au zoo, j'ai vu dix guépards, cinq zébus, un yak et le wapiti fumer"bksl-nl )bksl-nl == Truebksl-nl)bksl-nl# Tout dans l'ordrebksl-nlassert estpy-undpangramme(asciipy-undlowercase) == Truebksl-nl# Tout à l'enversbksl-nlassert estpy-undpangramme(asciipy-undlowercase[::-1]) == Truebksl-nl# Tout en doublebksl-nlassert estpy-undpangramme(asciipy-undlowercase py-str 2) == Truebksl-nl# Sans le "a"bksl-nlassert estpy-undpangramme(" ".join(asciipy-undlowercase[1:])) == Falsebksl-nl# Sans le "b"bksl-nlassert estpy-undpangramme(" ".join("a" + asciipy-undlowercase[2:])) == Falsebksl-nl# Sans le "z"bksl-nlassert estpy-undpangramme(" ".join(asciipy-undlowercase[:-1])) == Falsebksl-nlbksl-nl 5/5

def indice(minuscule):bksl-nl return ord(minuscule) - ord("a")bksl-nlbksl-nlbksl-nldef estpy-undpangramme(phrase):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nlassert estpy-undpangramme("portez ce vieux whisky au juge blond qui fume !") == Truebksl-nlassert estpy-undpangramme("portez un vieux whisky au juge blond qui fume !") == Falsebksl-nlassert (bksl-nl estpy-undpangramme("jugez que ce texte renferme l'alphabet, dix voyelles, k et w")bksl-nl == Truebksl-nl)bksl-nlassert (bksl-nl estpy-undpangramme("jugez que ce texte renferme l'alphabet, dix voyelles et w") == Falsebksl-nl)bksl-nlbksl-nldef indice(minuscule):bksl-nl return ord(minuscule) - ord("a")bksl-nlbksl-nlbksl-nldef estpy-undpangramme(phrase):bksl-nl presences = [False] py-str 26bksl-nlbksl-nl for caractere in phrase:bksl-nl if "a" <= caractere <= "z":bksl-nl presences[indice(caractere)] = Truebksl-nlbksl-nl for i in range(26):bksl-nl if not presences[i]:bksl-nl return Falsebksl-nlbksl-nl return Truebksl-nlbksl-nl

A

On crée tout d'abord la liste des booléens indicateurs de la présence de chaque lettre dans la phrase.

On parcourt ensuite la chaîne de caractères. Pour chaque caractère on bascule la valeur du booléen à True.

La chaîne est donc un pangramme si, en fin de boucle, la liste presences ne contient que des True. On le vérifie, ici, à l'aide d'une boucle.

Il aurait aussi été possible d'utiliser un dictionnaire. Dans ce cas, on n'aurait pas eu recours à la fonction indice :

🐍 Script Python
def est_pangramme(phrase):
    presences = {}
    for caractere in phrase:
        if "a" <= caractere <= "z":
            presences[caractere] = True

    return len(presences) == 26

Notons enfin que, dans le cas d'une liste de booléens, la fonction all permet de tester que chacun d'entre eux vaut True. On peut ainsi simplifier le dernier test :

🐍 Script Python
def est_pangramme(phrase):
    presences = [False] * 26
    for caractere in phrase:
        if "a" <= caractere <= "z":
            presences[indice(caractere)] = True

    return all(presences)

Z

Astuce

On pourra utiliser une structure de données, une liste de booléens ou un dictionnaire par exemple, afin de garder trace des lettres lues lors du parcours de la chaîne de caractères.