1 Lettres en commun 2 Premi`ere occurrence d`un

Transcription

1 Lettres en commun 2 Premi`ere occurrence d`un
Claude Bernard 2013-2014
Informatique - T.P. n 7
Chaı̂nes de caractères (II)
Le but de ce T.P. est de mettre en œuvre un algorithme classique sur les chaı̂nes de caractères :
la recherche d’un mot dans un texte.
Créer un dossier TP7. Pour chaque exercice, créer un nouveau fichier.
Dans tout le TP, on supposera que les chaı̂nes de caractères manipulées ne sont pas vides.
1
Lettres en commun
Écrire une fonction lettres communes qui compare deux chaı̂nes de caractères et renvoie
l’indice de la première lettre pour laquelle elles di↵èrent. En particulier, si les chaı̂nes sont égales,
la fonction lettres communes renvoie la longueur des chaı̂nes.
>>> lettres_communes("algebre",’algorithme’)
3
>>> lettres_communes("algebre",’al’)
2
>>> lettres_communes("algebre",’algebre’)
7
2
Première occurrence d’un motif dans un texte
Trouver les occurrences d’une chaı̂ne de caractères (usuellement appelée motif) dans une
autre chaı̂ne de caractères (usuellement appelée texte) est un problème fréquent pour les éditeurs de texte (OpenOffice writer, word. . . ) et les moteurs de recherche (google, bing. . . ). Les
algorithmes de recherche de chaı̂nes de caractères sont également utilisés pour l’analyse de génome.
Que faut-il mettre à la place du point d’interrogation pour corriger la fonction ci-dessous ?
Cette dernière reçoit en paramètre deux chaı̂nes de caractères texte et motif et renvoie la
position de la première occurrence de motif dans chaine, et -1 si motif n’est pas une souschaı̂ne de texte.
def cherche(motif,texte) :
"""
en entree : motif et texte sont des chaines de caracteres non vides
en sortie : le premier indice auquel motif apparait dans texte
ou -1 si texte ne contient pas motif
"""
T = len(texte)
M = len(motif)
for i in range(?) :
if motif == texte[i:i + M] :
return i
return -1
Tester votre fonction sur plusieurs cas particuliers.
Exemples
>>> cherche("Milou","Milou")
0
>>> cherche("Milou","Tintin")
-1
>>> cherche("tin","Tintin")
3
>>> cherche("i","Tintin")
1
Trouver une fonction intégrée qui réalise la même opération.
Claude Bernard 2013-2014
3
Informatique - T.P. n 7
Dernière occurrence
Écrire une fonction cherche fin très largement inspirée de la fonction cherche précédente.
La fonction cherche fin doit renvoyer l’indice de la dernière occurrence de motif dans texte
(ou -1 si le texte ne contient pas le motif).
Exemples
>>> cherche_fin("Milou","Milou")
0
>>> cherche_fin("Milou","Tintin")
-1
>>> cherche_fin("tin","Tintin")
3
>>> cherche_fin("i","Tintin")
4
Trouver une fonction intégrée qui donne la même réponse.
4
Avec deux boucles
L’un des multiples défauts du programme de l’exercice 2 est qu’il crée les nombreuses chaı̂nes
texte[i : i + M]. En s’inspirant de la fonction cherche, écrire une fonction cherche2 corrigeant
ce défaut et utilisant deux boucles imbriquées. Il s’agit donc de remplacer la comparaison motif == texte[i:i + M] par une boucle qui parcourra les caractères de la chaı̂ne motif.
5
Nombre d’occurrences
Reprendre la fonction cherche2 et la modifier pour qu’elle compte le nombre d’occurrences
du motif dans le texte. On nommera nombre cette nouvelle fonction.
Trouver une fonction intégrée réalisant la même opération.
6
Substitution
Écrire une fonction subst qui substitue le motif old contenu dans la chaı̂ne texte par la
chaı̂ne new donnée en argument. Cette fonction correspond au chercher-remplacer des éditeurs
de texte (Ctrl+h dans word ou idle). La fonction prend trois arguments :
• une chaı̂ne principale texte à l’intérieur de laquelle s’e↵ectue la substitution ;
• un mot de substitution : new ;
• l’ancien motif : old.
et renvoie la chaı̂ne modifiée.
Coder la fonction subst à l’aide d’une ou plusieurs boucles. S’inspirer de la fonction cherche.
Exemples
>>> subst("d","t","Dupond")
’Dupont’
>>> subst(’Romains’,"Bretons","Ils sont fous, ces Romains !")
’Ils sont fous, ces Bretons !’
>>> subst("ennemis","amis","Les ennemis de mes ennemis sont mes amis")
’Les amis de mes amis sont mes amis’
Utiliser exclusivement la fonction subst pour transformer la chaı̂ne
Il faut manger pour vivre et non pas vivre pour manger.
en
Il faut vivre pour manger et non pas manger pour vivre.
1/4
2/4
Claude Bernard 2013-2014
Informatique - T.P. n 7
La fonction subst pourra être utilisée plusieurs fois.
Trouver une fonction intégrée réalisant la même opération que la fonction subst.
7
Claude Bernard 2013-2014
Informatique - T.P. n 7
la fonction dessin pendu définie dans le fichier dessin.py et prenant pour argument reste le
nombre d’essais restants. La fonction est dans mot doit également afficher dec et le nombre
d’essais restants. La fonction est dans mot renvoie dans l’ordre dec et reste.
Bonus : évaluer la complexité
Modifier la fonction cherche2 précédente (la fonction s’appellera désormais cherche3) pour
qu’elle affiche le nombre de comparaisons de deux caractères qu’elle a e↵ectuées. La fonction
cherche3 renverra un tuple contenant deux éléments : le résultat de la recherche et le nombre
de comparaisons.
Exemples
>>> cherche3("a","b")
(-1, 1)
>>> cherche3("a","a")
(0, 1)
>>> cherche3("abcd","abcabcabcd")
(6,16)
8
Bonus : joker
Les jokers (wildcard characters) sont des caractères pouvant remplacer un ou plusieurs caractères lors de la recherche d’un motif. Ce mécanisme est utilisé dans les shell unix, dans les bases
de données SQL, etc. Dans cet exercice, nous nous limiterons au caractère de substitution ? qui
remplace un unique caractère. À titre d’exemple, les mots ”toto”, ”titi” et ”tata” correspondent
tous les trois au motif ”t ?t ?”. Écrire une fonction joker(motif, texte) qui teste si la chaı̂ne
texte passée en paramètre contient une sous-chaı̂ne correspondant à motif. Il est évidemment
exclu d’utiliser le module re. On pourra s’inspirer de la fonction cherche2. Le texte n’utilise
naturellement pas le caractère "?".
Exemples
>>> joker("?i","riri")
True
>>> joker("?i","fifi")
True
>>> joker("?i","loulou")
False
9
Bonus : le jeu du pendu
Vous disposez du script principal pendumain.py. Ouvrez-le et analysez-le.
Au cours de la boucle while le script fait appel à la fonction est dans mot définie dans le
fichier est dans mot.py que vous devez écrire. Cette fonction prend comme arguments :
• entre : la lettre donnée par le joueur
• mot : le mot à découvrir
• dec : une chaı̂ne de caractères avec les lettres déjà trouvées par le joueurs et des tirets ’-’
pour les autres
• reste : le nombre d’essais restants
La fonction est dans mot teste si la lettre entre est présente dans le mot inconnu mot et
si elle n’a pas déjà été proposée. Si c’est le cas, dec doit être modifié. Dans le cas contraire,
il faut modifier reste et avancer le tracé du pendu. Pour e↵ectuer le dessin, on fera appel à
3/4
4/4

Documents pareils