Aller au contenu

Sujet n°7

Sujet original

Pour télécharger l'énoncé original, cliquer ici.

Exercice n°1

Programmer la fonction fusion() prenant en paramètres deux tableaux non vides tab1 et tab2 (de type list) d'entiers, chacun dans l’ordre croissant, et renvoyant un tableau trié dans l’ordre croissant et contenant l’ensemble des valeurs de tab1 et tab2.

Exemples

>>> fusion([3, 5], [2, 5])
[2, 3, 5, 5]

>>> fusion([-2, 4], [-3, 5, 10])
[-3, -2, 4, 5, 10]

>>> fusion([4], [2, 6])
[2, 4, 6]
Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def fusion(tab1, tab2):
    """
    tab1, tab2 - list, tableaux d'entiers triés par ordre croissant
    Sortie: list, tableau trié par ordre croissant
            et contenant les éléments de tab1 et tab2
    """
    n1 = len(tab1)
    n2 = len(tab2)
    tab = []
    i1 = 0
    i2 = 0
    while i1 < n1 and i2 < n2 :
        if tab1[i1] < tab2[i2]:
            tab.append(tab1[i1])
            i1 = i1+1
        else:
            tab.append(tab2[i2])
            i2 = i2+1
    for i in range(i1, n1):
        tab.append(tab1[i])
    for i in range(i2, n2):
        tab.append(tab2[i])
    return tab



if __name__ == '__main__':
    # Exemples de l'énoncé
    print(fusion([1, 6, 10], [0, 7, 8, 9]) == [0, 1, 6, 7, 8, 9, 10])
    print(fusion([1, 6, 10, 11], [0, 7, 8]) == [0, 1, 6, 7, 8, 10, 11])
    print(fusion([1, 6, 6, 6, 10], [0, 6, 7, 7, 8, 9, 9]) == [0, 1, 6, 6, 6, 6, 7, 7, 8, 9, 9, 10])

    # Exemples supplémentaires
    print(fusion([1, 7], [2, 3, 4, 5]) == [1, 2, 3, 4, 5, 7])
    print(fusion([1, 2], [3, 4, 5]) == [1, 2, 3, 4, 5])

Exercice n°2

Le but de cet exercice est d’écrire une fonction récursive traduire_romain qui prend en paramètre une chaîne de caractères, non vide, représentant un nombre écrit en chiffres romains et qui renvoie son écriture décimale.

Les chiffres romains considérés sont : I, V, X, L, C, D, et M.
Ils représentent respectivement les nombres 1, 5, 10, 50, 100, 500, et 1000 en base dix..

On dispose d’un dictionnaire romains dont les clés sont les caractères apparaissant dans l’écriture en chiffres romains et les valeurs sont les nombres entiers associés en écriture décimale :

romains = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}

Le code de la fonction traduire_romain repose sur le principe suivant :

  • la valeur d’un caractère est ajoutée à la valeur du reste de la chaîne si ce caractère a une valeur supérieure (ou égale) à celle du caractère qui le suit ;
  • la valeur d’un caractère est retranchée à la valeur du reste de la chaîne si ce caractère a une valeur strictement inférieure à celle du caractère qui le suit.

Ainsi, "XIV" correspond au nombre 10 + 5 - 1 puisque :

  • la valeur de "X" (10) est supérieure à celle de "I" (1), on ajoute donc 10 à la valeur du reste de la chaîne, c’est-à-dire "IV" ;

  • la valeur de "I" (1) est strictement inférieure à celle de "V" (5), on soustrait donc 1 à la valeur du reste de la chaîne, c’est-à-dire "V".

On rappelle que pour priver une chaîne de caractères de son premier caractère, on utilisera l’instruction :

nom_de_variable[1:] 

Par exemple, si la variable mot contient la chaîne "CDI", mot[1:] renvoie "DI".

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def traduire_romain(nombre) :
    """ Renvoie l'ecriture decimale du nombre donné en chiffres romains """

    if len(nombre) == 1:
        return ...

    elif romains[nombre[0]] >= ... :
        return romains[nombre[0]] + ...
    else:
        return ...
Commentaires sur le code original
  1. Pour télécharger l'original du fichier à compléter, cliquer ici.

  2. L'instruction permettant de construire la chaîne privée du premier caractère fait appel au « slicing », ce qui n'est pas recommandé par les instructions officielles :

    11
    nom_de_variable[1:] 
    

Compléter le code de la fonction traduire_romain et le tester.

Exemples

>>> traduire_romain("XIV") 
14 

>>> traduire("CXLII") 
142 

>>> traduire_romain("MMXXIII")
2023
Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
def traduire_romain(nombre) :
    """ Renvoie l'ecriture decimale du nombre donné en chiffres romains """

    if len(nombre) == 1:
        return romains[nombre]

    elif romains[nombre[0]] >= romains[nombre[1]] :
        return romains[nombre[0]] + traduire_romain(nombre[1:])
    else:
        return -romains[nombre[0]] + traduire_romain(nombre[1:])

if __name__ == '__main__':
    romains = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}

    # Exemples de l'énoncé
    print(traduire_romain("XIV") == 14)
    print(traduire_romain("CXLII") == 142)

    # Exemples supplémentaires
    print(traduire_romain("XVI") == 16)
    print(traduire_romain("CDIII") == 403)
    print(traduire_romain("CMXLIX") == 949)