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
>>> 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
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 estpy-undpangramme("jugez que ce texte renferme l'alphabet, dix voyelles, k et w") == Truebksl-nlassert estpy-undpangramme("jugez que ce texte renferme l'alphabet, dix voyelles et w") == Falsebksl-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-nl bksl-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
:
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 :
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.