Exercices Difficiles — Chaînes de
caractères et Boucles (Python)
1 Compression de chaîne (Run-Length Encoding)
1️⃣
**Énoncé :** Écrire un programme qui compresse une chaîne en remplaçant chaque groupe
de lettres identiques consécutives par la lettre suivie du nombre d’occurrences.
Exemple : 'aaabbccccd' devient 'a3b2c4d1'
**Solution Python :**
def compresser(chaine):
resultat = ""
i=0
while i < len(chaine):
compteur = 1
while i + 1 < len(chaine) and chaine[i] == chaine[i + 1]:
compteur += 1
i += 1
resultat += chaine[i] + str(compteur)
i += 1
return resultat
print(compresser("aaabbccccd")) # a3b2c4d1
2️⃣Vérifier les anagrammes
**Énoncé :** Écrire un programme qui vérifie si deux mots sont des anagrammes (mêmes
lettres mais ordre différent).
**Solution Python :**
def sont_anagrammes(mot1, mot2):
mot1, mot2 = [Link](" ", "").lower(), [Link](" ", "").lower()
return sorted(mot1) == sorted(mot2)
print(sont_anagrammes("chien", "niche")) # True
print(sont_anagrammes("chat", "tache")) # False
3️⃣Chiffrement César
**Énoncé :** Écrire un programme qui chiffre un texte par la méthode de César avec un
décalage donné.
Exemple : décalage = 3 → A devient D, B devient E, etc.
**Solution Python :**
def cesar(message, decalage):
resultat = ""
for c in message:
if [Link]():
base = ord('A') if [Link]() else ord('a')
resultat += chr((ord(c) - base + decalage) % 26 + base)
else:
resultat += c
return resultat
print(cesar("Bonjour", 3)) # Erqmrxu
4️⃣Palindrome avec nettoyage
**Énoncé :** Vérifier si une phrase est un palindrome, en ignorant les espaces, majuscules et
ponctuations.
**Solution Python :**
def est_palindrome(phrase):
import string
propre = "".join([Link]() for c in phrase if [Link]())
return propre == propre[::-1]
print(est_palindrome("Élu par cette crapule")) # True
5️⃣Distance de Levenshtein
**Énoncé :** Écrire un programme qui calcule la distance d’édition entre deux chaînes
(ajout, suppression, substitution).
**Solution Python :**
def levenshtein(a, b):
n, m = len(a), len(b)
dp = [[0]*(m+1) for _ in range(n+1)]
for i in range(n+1):
dp[i][0] = i
for j in range(m+1):
dp[0][j] = j
for i in range(1, n+1):
for j in range(1, m+1):
cout = 0 if a[i-1] == b[j-1] else 1
dp[i][j] = min(
dp[i-1][j] + 1,
dp[i][j-1] + 1,
dp[i-1][j-1] + cout
)
return dp[n][m]
print(levenshtein("chat", "chut")) # 1
6️⃣Détecter le mot le plus long
**Énoncé :** Écrire un programme qui trouve le mot le plus long dans une phrase.
**Solution Python :**
def mot_plus_long(phrase):
mots = [Link]()
plus_long = mots[0]
for mot in mots:
if len(mot) > len(plus_long):
plus_long = mot
return plus_long
print(mot_plus_long("Python est un excellent langage de programmation"))
7️⃣Fréquence des lettres
**Énoncé :** Écrire un programme qui affiche la fréquence d’apparition de chaque lettre
dans une chaîne.
**Solution Python :**
def frequence_lettres(chaine):
freq = {}
for c in [Link]():
if [Link]():
freq[c] = [Link](c, 0) + 1
return freq
print(frequence_lettres("programmation"))
8️⃣Vérifier si une phrase est un pangramme
**Énoncé :** Un pangramme contient toutes les lettres de l’alphabet au moins une fois.
Écrire un programme qui vérifie cette propriété.
**Solution Python :**
def est_pangramme(phrase):
alphabet = set("abcdefghijklmnopqrstuvwxyz")
lettres = set([Link]() for c in phrase if [Link]())
return [Link](lettres)
print(est_pangramme("Portez ce vieux whisky au juge blond qui fume")) # True