Exercice en Python : Deux vérifications de palindrome

Vous pouvez copier-coller la solution proposée directement dans votre éditeur de programmes Python. Veillez toutefois à retaper vous-même certains programmes afin de vous exercer pour quand vous devrez taper vos programmes personnels.

Une bonne chose serait sans doute de définir ce qu'est un palindrome. Si je vous signale de "radar", "non", "kayak"... sont des palindromes et que "bonjour", "au revoir"... n'en sont pas, vous aurez compris qu'un palindrome est un mot (ou une phrase) qu'on peut lire dans les deux sens.

Comme toujours en codage ou programmation, il y a plusieurs manières d'aborder un problème. Dans ce cas du palindrome, nous allons résoudre cela de deux manières. La première sera cette du miroir ou symétrie et la seconde utilisera... des listes.

La méthode symétrique

Le principe de cette méthode est simple, on va comparer :

  • Le premier caractère avec le dernier;
  • Le second caractère avec l'avant-dernier;
  • Et ainsi de suite jusqu'à arriver au centre du mot (il n'est pas nécessaire d'aller plus loin);
  • Le tour de main du signal permettra de savoir, au bout de la vérification, si tous les couples de lettres comparées étaient bien identiques ou pas.

C'est le moment de faire l'analyse du programme de vous devez réaliser.

Voir une analyse

Dans une chaîne de caractères, chaque caractère a un indice de position. Pour "bonjour", la longueur du mot est de 7 caractères mais l'indice du "b" est 0. L'indice du "r" à la fin du mot est 6. Ceci introduit une petite complication.

Pour un mot de 7 caractères, il faudra donc comparer le caractère 0 au 6, le 1 au 5, le 2 au 4 et cela suffira, le 3 étant le centre de symétrie du mot.

Une façon judicieuse de fonctionner serait donc :

  1. D'utiliser une boucle FOR qui tournera un nombre de fois égal à la moitié de la longeur du mot (division entière);
  2. Cette boucle commencera à compter à partir de 0, ce qui est une bonne chose...;
  3. Mais pour trouver l'incice du caractère symétrique, il faudra décompter 1 de la longueur du mot. Pour "bonjour", le "r" est à la position len("bonjour")-1;
  4. Quand la variable de comptage de la boucle, par exemple i, sera égale à 1, càd au premier "o", le caractère symétrique sera le "u" en position len("bonjour")-i-1;
  5. De cette façon, il sera possible de comparer tous les couples de part et d'autre du point symétrique du mot, que le nombre de caractères soit pair ou impair.

Un simple tour de main du signal pemettra de savoir, en fin de boucle, si tous les couples étaient égaux, et permettra même, si on le désire, d'interrompre la comparaison à la première différence constatée puisqu'il devient inutile de la continuer.

Cacher cette analyse

Il vous reste maintenant à réaliser votre programme en Python... et à le vérifier ensuite.

Voir une solution

Programme de vérification symétrique ou du miroir

print("Ce programme vérifie si le mot que vous tapez est un palindrome ou non.")
chaine = input("Veuillez entrer le mot à vérifier : ")
moitie = len(chaine) // 2 # En cas de nombre de lettres impair, // effectue la division entière
palindrome = True # Tour de main du signal, on considère que le palindrome est vrai
for i in range (moitie):
     if chaine[i] != chaine[len(chaine) - 1 - i]: # Comparaison des caractères symétriques
          palindrome = False
          break # Permet de sortir "brusquement" de la boucle for avant la fin
if palindrome :
     print (chaine,"est un palindrome")
else:
     print (chaine,"N'est PAS un palindrome")

Cacher cette solution

On comprend la limite de cette méthode si on tape les mots "Radar" ou "ka yak". Normalement, ces deux mots sont des palindromes, il ne doit pas être tenu compte des espaces, majuscules, accents... C'est là que la seconde méthode s'avère indispensable.

La méthode utilisant les listes

Comment pourrions-nous réaliser un programme à base de listes qui considère que cette vilaine phrase "élu par cette crapule" est bien un palindrome ?

Voir une analyse

Le principe est de réaliser les tâches suivantes :

  1. Lire le mot ou la phrase à vérifier au clavier;
  2. Copier, caractère par caractère, le mot ou la phrase lue au clavier dans une liste que l'on peut appeler endroit;
  3. Effectuer une copie d'endroit dans une autre liste appelée envers;
  4. Inverser l'ordre des caractères dans envers
  5. Comparer les deux listes, si elles sont identiques, le mot ou la phrase est un palindrome.

En quoi cela peut-il aider en cas d'espace, de majuscule... ?

L'avantage de cette méthode est le traitement que l'on peut faire au moment où on copie le caractère dans la liste. Si c'est un espace, on ne le copie pas. Si c'est un caractère accentué ou une majuscule, on le remplace par la minuscule correspondante. Bien entendu, ce traitement sera lourd si on veut envisager tous les cas. Nous nous limiterons pour l'exemple au cas de la vilaine phrase.

Cacher cette analyse

Il vous reste maintenant à réaliser votre programme en Python... et à le vérifier ensuite.

Voir une solution

chaine = input("Veuillez entrer le mot ou la phrase à vérifier : ")
endroit = [ ] # On va copier la chaîne chaine dans une liste plus facile à manipuler
for i in range (len(chaine)):
     if chaine[i] != " ": # Si le caractère n’est pas un espace (on ne copie pas les espaces)
          endroit.append(chaine[i]) # On l’insère dans la liste endroit
for i in range (len(endroit)): # On parcourt endroit pour remplacer les caractères spéciaux par des minuscules simples
     if endroit[i] in ['é','è','ê','ë','E','É']: # On remplace toutes les variantes de ‘e’ par ‘e’
          endroit[i] = 'e'
# idem avec les variantes de a, de c, de i, de o et de u ainsi que les majuscules.
envers = endroit.copy() # On copie la liste endroit dans la liste envers
envers.reverse() # On inverse la liste envers
if endroit == envers:
     print ("|",chaine,"| est un palindrome")
else:
     print ("|",chaine,"| N'est PAS un palindrome")

Cacher cette solution

Voilà... Bon amusement si vous voulez réaliser un programme de vérification de palindrome qui prend en compte toutes les formes de caractères. C'est possible : "À cœur vaillant, rien d'impossible".

Retour