Aller au contenu

Facteurs

Définition

Pour un mot donné m, on appelle facteur de m tout mot apparaissant dans m.

Exemples:

  • Les facteurs du mot "NSI" sont N, S, I, NS, SI, NSI (et le mot vide).
  • Les facteurs du mot "carambar": c, a, r, m, b, ca, ar, ra, am, mb, ba, car, ara, ram, amb, mba, bar, cara, aram, ramb, amba, mbar, caram, aramb, ramba, ambar, caramb, aramba, rambar, caramba, arambar, carambar (et le mot vide).

Un facteur du mot m est donc un mot dont les lettres sont des lettres consécutives du mot m.

Exercice 1

Écrire un code possible pour la fonction suivante:

def facteur(mot, début, longueur):
    """
    mot -- chaîne de caractères
    début -- entier entre 0 et len(mot)-1
    longueur -- entier entre 1 et len(mot) 

    renvoie le facteur de mot commençant au caractère
    d'indice  début et comportant longueur caractères

    >>> facteur('carambar', 2,4)
    'ramb'
    """
Un code
def facteur(mot, début, longueur):
    """
    mot -- chaîne de caractères
    début -- entier entre 0 et len(mot)-1
    longueur -- entier entre 1 et len(mot) 

    renvoie le facteur de mot commençant au caractère
    d'indice  début et comportant longueur caractères

    >>> facteur('carambar', 2,4)
    'ramb'
    """
    assert 0 <= début < len(mot), f"{début} n'est pas un indice de la chaîne {mot}."
    assert 0 < longueur <= len(mot), f"Un facteur, non vide, a une longueur entre 1 et {len(mot)}."
    fact = ''
    for k in range(début, début + longueur):
        fact = fact + mot[k]
    return fact

Exercice 2

Écrire un code possible pour la fonction suivante:

def facteurs(mot, n):
    """
    mot -- chaine de caractères
    n -- entier naturel > 0

    renvoie une chaîne constituée des facteurs 
    de mot ayant longueur n,
    séparés par une virgule
    (certains facteurs peuvent éventuellement être répétés)

    >>> facteurs('carambar', 3)
    'car,ara,ram,amb,mba,bar'
    """
Un code

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

def facteurs(mot, n):
    """
    mot -- chaine de caractères
    n -- entier naturel > 0

    renvoie une chaîne constituée des facteurs 
    de mot ayant longueur n,
    séparés par une virgule
    (certains facteurs peuvent éventuellement être répétés)

    >>> facteurs('carambar', 3)
    'car,ara,ram,amb,mba,bar'
    """
    assert n > 0, "n doit être >0."
    assert n <= len(mot), "n ne peut être supérieur à len(mot)."
    ch = facteur(mot, 0, n)
    for k in range(1, len(mot)-n+1):
        ch = ch + ',' + facteur(mot, k, n)
    return ch

Exercice 3

Écrire un code possible pour la fonction suivante:

def facteur_commun_longueur(mot1, mot2, lg):
    """
    mot1 -- de type string
    mot2 -- de type string
    lg -- entier > 0

    renvoie un facteur commun à mot1 et mot2, de longueur n.
    renvoie la chaîne vide si un tel facteur n'existe pas.

    >>> facteur_commun_longueur('marcel', 'marcelle', 6)
    'marcel'
    """
Un code

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

def facteur_commun_longueur(mot1, mot2, lg):
    """
    mot1 -- de type string
    mot2 -- de type string
    lg -- entier > 0

    renvoie un facteur commun à mot1 et mot2, de longueur n.
    renvoie la chaîne vide si un tel facteur n'existe pas.

    >>> facteur_commun_longueur('marcel', 'marcelle', 6)
    'marcel'
    >>> facteur_commun_longueur('carambar', 'johnrambo', 4)
    'ramb'
    >>> facteur_commun_longueur('carambar', 'johnrambo', 2)
    'ra'
    """
    for i in range(0, len(mot1)-lg+1):
        for j in range(0, len(mot2)-lg+1):
            fact = facteur(mot1, i, lg)
            if fact == facteur(mot2, j, lg):
                return fact
    return ''

Exercice 4

Écrire un code possible pour la fonction suivante:

def facteur_commun(mot1, mot2):
    """
    mot1 -- de type string
    mot2 -- de type string

    renvoie, parmi les facteurs communs à mot1 et mot2, le plus long.
    renvoie la chaîne vide s'il n'y a pas de tel facteur.

    >>> facteur_commun('carambar', 'johnrambo')
    'ramb'
    >>> facteur_commun('Je suis ton père', 'bazooka')
    'o'
    >>> facteur_commun('Un Anneau pour les amener tous et dans les ténèbres les lier.', 'kzyk')
    ''
    """
Un code

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

def facteur_commun(mot1, mot2):
    """
    mot1 -- de type string
    mot2 -- de type string

    renvoie, parmi les facteurs communs à mot1 et mot2, le plus long.
    renvoie la chaîne vide s'il n'y a pas de tel facteur.

    >>> facteur_commun('carambar', 'johnrambo')
    'ramb'
    >>> facteur_commun('Je suis ton père', 'bazooka')
    'o'
    >>> facteur_commun('Un Anneau pour les amener tous et dans les ténèbres les lier.', 'kzyk')
    ''
    """
    # un préfixe commun ne peut dépasser la longueur
    # du plus court des deux mots:
    taille = min(len(mot1), len(mot2))

    for k in range(taille, 0, -1):
        fact = facteur_commun_longueur(mot1, mot2, k)
        if fact != '':
            return fact

    return ''