Aller au contenu

Motif

Dans les deux premiers exercices (et les suivants), on utilisera au moins deux chaînes de caractères:

  • une chaîne nommée texte, qui sera un long texte (par exemple le texte d'un roman).
  • une chaîne plus courte, qui sera nommée motif.

L'objectif, dans les deux premiers exercices, est de savoir si le motif est présent dans le texte (c'est à dire si motif est un facteur de texte où le terme facteur est utilisé au sens défini dans cette page).

Exercice 1

Écrire un code possible pour le corps de la fonction suivante:

def positionOK(motif, texte, position):
    """
    motif -- chaîne de caractères
    texte -- chaîne de caractères
    position -- entier, indice de la chaîne texte

    renvoie True si texte[position..position + longueur(motif)-1] = motif
    c'est à dire si le facteur de texte de longueur égale à celle de motif
    et commençant à l'indice position est égal à motif.
    renvoie False si texte[position..position + longueur(motif)-1] != motif.

    >>> positionOK('aha', 'abracadabraaha!', 11)
    True
    >>> positionOK('aha', 'abracadabraaha!', 13)
    False
    """
Un code
def positionOK(motif, texte, position):
    """
    motif -- chaîne de caractères
    texte -- chaîne de caractères
    position -- entier, indice de la chaîne texte

    renvoie True si texte[position..position + longueur(motif)-1] = motif
    c'est à dire si le facteur de texte de longueur égale à celle de motif
    et commençant à l'indice position est égal à motif.
    renvoie False si texte[position..position + longueur(motif)-1] != motif.

    >>> positionOK('aha', 'abracadabraaha!', 11)
    True
    >>> positionOK('aha', 'abracadabraaha!', 13)
    False
    """
    facteur = '' # contiendra une copie de 
                 # texte[position..position + longueur(motif)-1]

    # si position + longueur(motif) "sort" du texte:   
    if position + len(motif) > len(texte):
        return False

    # dans les autres cas:
    for k in range(position, position + len(motif)):
        facteur = facteur + texte[k]

    return facteur == motif
Autre solution

Dans cette autre solution, on ne construit pas le facteur en entier: on peut s'arrêter dès qu'une lettre de texte[position..position + longueur(motif)-1] est distincte de la lettre correspondante dans motif.

def positionOK(motif, texte, position):
    """
    motif -- chaîne de caractères
    texte -- chaîne de caractères
    position -- entier, indice de la chaîne texte

    renvoie True si texte[position..position + longueur(motif)-1] = motif
    c'est à dire si le facteur de texte de longueur égale à celle de motif
    et commençant à l'indice position est égal à motif.
    renvoie False si texte[position..position + longueur(motif)-1] != motif.

    >>> positionOK('aha', 'abracadabraaha!', 11)
    True
    >>> positionOK('aha', 'abracadabraaha!', 13)
    False
    """    
    if position + len(motif) > len(texte):
        return False

    for k in range(position, position + len(motif)):
        if texte[k] != motif[k-position]:
            return False

    return True

Exercice 2

Écrire un code possible pour le corps de la fonction suivante:

def trouve(motif, texte):
    """
    motif -- chaîne de caractères
    texte -- chaîne de caractères


    renvoie le plus petit indice de texte tel que 
    texte[indice..indice + longueur(motif)-1] = motif.
    renvoie -1 si motif n'est pas un facteur de texte.

    >>> trouve('aha', 'abracadabraaha!')
    11
    >>> trouve('anneau', 'Un anneau pour les diriger tous.')
    3
    >>> trouve('anneau', 'JavaScript est un langage de programmation de scripts principalement employé dans les pages web interactives.')
    -1    
    """
Un code

On utilise la fonction positionOK de l'exercice précédent.

def trouve(motif, texte):
    """
    motif -- chaîne de caractères
    texte -- chaîne de caractères


    renvoie le plus petit indice de texte tel que 
    texte[indice..indice + longueur(motif)-1] = motif.
    renvoie -1 si motif n'est pas un facteur de texte.

    >>> trouve('aha', 'abracadabraaha!')
    11
    >>> trouve('anneau', 'Un anneau pour les diriger tous.')
    3
    >>> trouve('anneau', 'JavaScript est un langage de programmation de scripts principalement employé dans les pages web interactives.')
    -1    
    """
    for k in range(0, len(texte)-len(motif)+1):
        if positionOK(motif, texte, k):
            return k
    return -1

Exercice 3

Écrire un code possible pour le corps de la fonction suivante:

def remplacePosition(motif, texte, position, mot):
    """
    motif -- chaîne de caractères
    texte -- chaîne de caractères
    position -- entier, indice de la chaîne texte
    mot -- chaîne de caratères     

    renvoie texte modifié:
    - si le facteur de texte de longueur len(motif) et commençant 
      à l'indice position est égal à motif,
      ce facteur est remplacé par mot.
    - si ce facteur n'est pas égal à motif, texte est inchangé.

    >>> remplacePosition('a', 'abracadabra', 1, 'i')
    'abracadabra'
    >>> remplacePosition('a', 'abracadabra', 3, 'i')
    'abricadabra'
    >>> remplacePosition('ton père', 'je suis ton père.', 8, 'un gremlin')
    'je suis un gremlin.'
    """

Note

Utilisez la fonction positionOK de l'exercice 1.

Un code
def remplacePosition(motif, texte, position, mot):
    """
    motif -- chaîne de caractères
    texte -- chaîne de caractères
    position -- entier, indice de la chaîne texte
    mot -- chaîne de caratères     

    renvoie texte modifié:
    - si le facteur de texte de longueur len(motif) et commençant 
      à l'indice position est égal à motif,
      ce facteur est remplacé par mot.
    - si ce facteur n'est pas égal à motif, texte est inchangé.

    >>> remplacePosition('a', 'abracadabra', 1, 'i')
    'abracadabra'
    >>> remplacePosition('a', 'abracadabra', 3, 'i')
    'abricadabra'
    >>> remplacePosition('ton père', 'je suis ton père.', 8, 'un gremlin')
    'je suis un gremlin.'
    """
    if not positionOK(motif, texte, position):
        return texte

    ch = ''
    # on recopie dans ch les lettres avec indice < position
    for k in range(0,position):
        ch = ch + texte[k]
    # on place le mot de remplacement:
    ch = ch + mot
    # on recopie les lettres de texte situées après le motif:
    for k in range(position+len(motif), len(texte)):
        ch = ch + texte[k]
    return ch