Aller au contenu

Sujet n°18

Sujet original

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

Exercice n°1

Écrire une fonction max_et_indice qui prend en paramètre une liste non vide tab de nombres entiers et qui renvoie la valeur du plus grand élément de cette liste ainsi que l’indice de sa première apparition dans cette liste.

L’utilisation de la fonction native max n’est pas autorisée.

Ne pas oublier d’ajouter au corps de la fonction une documentation et une ou plusieurs assertions pour vérifier les pré-conditions.

Commentaires

Ici, le mot « liste » est à comprendre dans le sens « liste Python » (c'est-à-dire tableau) plutôt que dans le sens du type abstrait de données liste étudié en Terminale.

Exemples

>>> max_et_indice([1, 5, 6, 9, 1, 2, 3, 7, 9, 8])
(9, 3)

>>> max_et_indice([-2])
(-2, 0)

>>> max_et_indice([-1, -1, 3, 3, 3])
(3, 2)

>>> max_et_indice([1, 1, 1, 1])
(1, 0)
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
def max_et_indice(tab):
    """
    tab - list, tableau de nombres entiers
    Sortie: tuple - couple contenant le plus grand élément du tableau tab ainsi que
            l'indice de sa première occurrence dans tab.
    """
    assert isinstance(tab, list) and len(tab) > 0, "Le tableau doit être non vide"
    i_maxi = 0
    for i in range(1, len(tab)):
        if tab[i] > tab[i_maxi]:
            i_maxi = i
    return (tab[i_maxi], i_maxi)


if __name__ == '__main__':
    # Exemples de l'énoncé
    print(max_et_indice([1, 5, 6, 9, 1, 2, 3, 7, 9, 8]) == (9, 3))
    print(max_et_indice([-2]) == (-2, 0))
    print(max_et_indice([-1, -1, 3, 3, 3]) == (3, 2))
    print(max_et_indice([1, 1, 1, 1]) == (1, 0))

    # Exemples supplémentaires
    print(max_et_indice([-2, -3, -4, -1]) == (-1, 3))
    print(max_et_indice([4]) == (4, 0))

Exercice n°2

L’ordre des gènes sur un chromosome est représenté par un tableau ordre de n cases d’entiers distincts deux à deux et compris entre 1 et n.

Exemple

ordre = [5, 4, 3, 6, 7, 2, 1, 8, 9] dans le cas n=9.

On dit qu’il y a un point de rupture dans ordre dans chacune des situations suivantes :

  • la première valeur de ordre n’est pas 1 ;
  • l’écart entre deux gènes consécutifs n’est pas égal à 1 ;
  • la dernière valeur de ordre n’est pas n.

Exemple

Si ordre = [5, 4, 3, 6, 7, 2, 1, 8, 9] dans le cas n=9, on a :

  • un point de rupture au début car 5 est différent de 1
  • un point de rupture entre 3 et 6 (l’écart est 3)
  • un point de rupture entre 7 et 2 (l’écart est 5)
  • un point de rupture entre 1 et 8 (l’écart est 7)

Il y a donc 4 points de rupture.

Compléter les fonctions Python est_un_ordre et nombre_points_rupture pour que :

  • la fonction est_un_ordre renvoie True si le tableau passé en paramètre représente bien un ordre de gènes de chromosome et False sinon ;
  • la fonction nombre_points_rupture renvoie le nombre de points de rupture d’un tableau passé en paramètre représentant l’ordre de gènes d’un chromosome.
 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
def est_un_ordre(tab):
    '''
    Renvoie True si tab est de longueur n et contient tous les entiers
    de 1 à n, False sinon
    '''
    for i in range(1,...):
        if ...:
            return False
    return True


def nombre_points_rupture(ordre):
    '''
    Renvoie le nombre de point de rupture de ordre qui représente un ordre
    de gènes de chromosome
    '''
    assert ... # ordre n'est pas un ordre de gènes
    n = len(ordre)
    nb = 0
    if ordre[...] != 1: # le premier n'est pas 1
        nb = nb + 1
    i = 0
    while i < ...:
        if ... not in [-1, 1]: # l'écart n'est pas 1
            nb = nb + 1
        i = i + 1
    if ordre[...] != n: # le dernier n'est pas n
        nb = nb + 1
    return nb
Commentaire sur le code original

Pour télécharger l'original du fichier à compléter, cliquer ici.

Exemples

>>> est_un_ordre([1, 6, 2, 8, 3, 7])
False

>>> est_un_ordre([5, 4, 3, 6, 7, 2, 1, 8, 9])
True

>>> nombre_points_rupture([5, 4, 3, 6, 7, 2, 1, 8, 9])
4

>>> nombre_points_rupture([1, 2, 3, 4, 5])
0

>>> nombre_points_rupture([1, 6, 2, 8, 3, 7, 4, 5])
7

>>> nombre_points_rupture([2, 1, 3, 4])
2
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
36
37
38
39
40
41
42
43
44
45
46
47
def est_un_ordre(tab):
    '''
    Renvoie True si tab est de longueur n et contient tous les entiers
    de 1 à n, False sinon
    '''
    for i in range(1, len(tab)+1):
        if i not in tab:
            return False
    return True


def nombre_points_rupture(ordre):
    '''
    Renvoie le nombre de point de rupture de ordre qui représente un ordre
    de gènes de chromosome
    '''
    assert est_un_ordre(ordre), "ordre n'est pas un ordre de gènes"
    n = len(ordre)
    nb = 0
    if ordre[0] != 1: # le premier n'est pas 1
        nb = nb + 1
    i = 0
    while i < len(ordre)-1:
        if ordre[i+1]-ordre[i] not in [-1, 1]: # l'écart n'est pas 1
            nb = nb + 1
        i = i + 1
    if ordre[len(ordre)-1] != n: # le dernier n'est pas n
        nb = nb + 1
    return nb


if __name__ == '__main__':
    # Exemples de l'énoncé
    print(est_un_ordre([1, 6, 2, 8, 3, 7]) == False)
    print(est_un_ordre([5, 4, 3, 6, 7, 2, 1, 8, 9]) == True)

    print(nombre_points_rupture([5, 4, 3, 6, 7, 2, 1, 8, 9]) == 4)
    print(nombre_points_rupture([1, 2, 3, 4, 5]) == 0)
    print(nombre_points_rupture([1, 6, 2, 8, 3, 7, 4, 5]) == 7)
    print(nombre_points_rupture([2, 1, 3, 4]) == 2)

    # Exemples supplémentaires
    print(est_un_ordre([1, 6, 2, 5, 3, 4]) == True)
    print(est_un_ordre([0, 1, 2, 3]) == False)

    print(nombre_points_rupture([5, 4, 3, 2, 1]) == 2)
    print(nombre_points_rupture([1]) == 0)