"TANT QUE"

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

  1. demande à l'utilisateur une chaîne de caractères ch1,
  2. demande à l'utilisateur une chaîne ch2,
  3. demande à l'utilisateur une chaîne ch3,
  4. 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 ?

Résolution de l'exercice "Substitution à répétition".

Question 1

Lors d'une instruction texte=texte.replace(chaine1, chaine2), toutes les occurrences de chaine1 présentes dans texte sont remplacées par chaine2.

Question 2


ch1=input('Entrez une première chaîne : ')
ch2=input('Entrez une seconde chaîne : ')
ch3=input('Entrez une troisième chaîne : ')

while ch2 in ch1 :
	ch1=ch1.replace(ch2,ch3)
	
print(ch1)

Question 3

Si ch1='bxdrt', ch2='b' et ch3='ba', alors ch1 devient 'baxdrt', puis 'baaxdrt' puis 'baaaxdrt' ... et ainsi de suite à l'infini. Il faut évidemment éviter de lancer le programme sur un tel cas, à moins d'ajouter une condition d'arrêt indépendante (par exemple en fixant un nombre maximum d'itérations.)

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 :

  1. En première ligne, on commence par la chaîne '1'.
  2. En seconde ligne, on écrit ce qu'on voit en première ligne : un '1', ce qui donne '11'.
  3. En troisième ligne, on lit ce que l'on voit dans la ligne précédente : deux '1', ce qui donne '21'.
  4. Sur la ligne suivante, on écrit de même ce que l'on voit : un '2' et un '1', ce qui donne '1211'
  5. ...et ainsi de suite.

Écrire un programme qui :

  1. demande un entier n > 0 à l'utilisateur,
  2. 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 :

  1. 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 !)
  2. 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.
  3. 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.