Substitution à répétition.
Question 1.
Étudier le rôle de la méthode replace (méthode qui s'applique à un string) en testant le programme suivant.
texte=' abracadabra gloubiboulga chabada tsoin tsoin'
texte=texte.replace('ab', 'ruv')
print(texte)
Question 2
Le rôle de cette méthode étant comprise, écrire un programme qui
- demande à l'utilisateur une chaîne de caractères ch1,
- demande à l'utilisateur une chaîne ch2,
- demande à l'utilisateur une chaîne ch3,
- remplace dans ch1 tous les ch2 par des ch3 tant qu'il y en a.
Attention, si ch1='baaac', ch2='ba' et ch3='b' alors le résultat attendu n'est pas 'baac' puisque ch2 est encore présent.
L'opération de substitution doit donc être à nouveau réalisée.
Question 3
Existe-t-il des situations telles que le programme ne s'arrête jamais ?
Suite de Conway.
Saurez-vous déterminer la logique de passage d'une ligne à l'autre dans ce qui suit :
1
11
21
1211
111221
312211
13112221
1113213211
Explication :
- En première ligne, on commence par la chaîne '1'.
- En seconde ligne, on écrit ce qu'on voit en première ligne : un '1', ce qui donne '11'.
- En troisième ligne, on lit ce que l'on voit dans la ligne précédente : deux '1', ce qui donne '21'.
- Sur la ligne suivante, on écrit de même ce que l'on voit : un '2' et un '1', ce qui donne '1211'
- ...et ainsi de suite.
Écrire un programme qui :
- demande un entier n > 0 à l'utilisateur,
- affiche n lignes du triangle ci-dessus.
Résolution de l'exercice "Suite de Conway".
n=int(input(' Nombre de lignes ? '))
chaine_totale='1' # désignera le triangle
chaine_ligne='1' # désignera une ligne du triangle
for j in range(n) :
aux=chaine_ligne
chaine_ligne='' #réinitialisation à la chaîne vide pour calcul de la prochaine ligne
while aux!='' : # tant que la chaîne aux n'est pas vide
cpt=0 # compteur pour le nombre de répétitions
# du premier symbole au début de la chaîne aux
premiere_lettre=aux[0] # premier symbole de la chaîne aux
while (aux!='' and aux[0]==premiere_lettre) : # tant que le premier symbole
# de la chaîne reste le même
aux=aux[1:] # on supprime le premier symbole de la chaîne aux
cpt+=1
chaine_ligne+=str(cpt)+premiere_lettre # on complète la ligne actuelle
chaine_totale+='\n'+chaine_ligne # on ajoute la ligne qui vient d'être calculée au triangle
print(chaine_totale)
Quelques remarques :
- Ce programme est un peu plus difficile que les précédents : prenez le temps de le décortiquer et de le comprendre
( notamment si vous
n'avez pas su en écrire une version !)
- aux désignant une chaîne de caractères, l'instruction
aux[1:]
a la même signification que
aux[1:len(aux)]
et désigne la sous-chaîne de aux constituée de toutes les lettres de aux, sauf la première.
- Lorsqu'un programme présente, comme celui-ci, un empilement de petites procédures techniques (compter le nombre de caractères identiques en début de mot,
en déduire une nouvelle chaîne, concaténer cette chaîne avec une autre...etc), on le rend plus compréhensible
en le découpant en fonctions. Nous verrons cela dans le chapitre sur les fonctions.