Aller au contenu

Ep 18

▶ TĂ©lĂ©charger le sujet en pdf.

EXERCICE 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.

Exemples :

🐍 Script Python
    >>> 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)
RĂ©ponse

Complétez le code ci-dessous

###
# Mettre ici votre codebksl-nlbksl-nl



Solution

###
def maxpy-undetpy-undindice(tab):bksl-nl '''bksl-nl renvoie la valeur du plus grand Ă©lĂ©ment de cette liste ainsibksl-nl que l’indice de sa premiĂšre apparition dans cette liste.bksl-nl '''bksl-nl assert tab != [], 'le tableau est vide'bksl-nlbksl-nl valpy-undmax = tab[0]bksl-nl indpy-undmax = 0bksl-nl for i in range(len(tab)):bksl-nl if tab[i] > valpy-undmax:bksl-nl valpy-undmax = tab[i]bksl-nl indpy-undmax = ibksl-nl return (valpy-undmax, indpy-undmax)bksl-nlbksl-nl



EXERCICE 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.

Par 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.

Par exemple, si ordre = [5, 4, 3, 6, 7, 2, 1, 8, 9] avec 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 de 3)
  • un point de rupture entre 7 et 2 (l’écart est de 5)
  • un point de rupture entre 1 et 8 (l’écart est de 7)

Il y a donc 4 points de rupture.

Compléter les fonctions Python est_un_ordre et nombre_points_rupture proposées à la page suivante 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.

RĂ©ponse

Complétez le code ci-dessous

###
def estpy-undunpy-undordre(tab):bksl-nl '''bksl-nl Renvoie True si tab est de longueur n et contient tous les entiersbksl-nl de 1 à n, False sinonbksl-nl '''bksl-nl for i in range(1,...):bksl-nl if ...:bksl-nl return Falsebksl-nl return Truebksl-nlbksl-nlbksl-nldef nombrepy-undpointspy-undrupture(ordre):bksl-nl '''bksl-nl Renvoie le nombre de point de rupture de ordre qui représente un ordrebksl-nl de gÚnes de chromosomebksl-nl '''bksl-nl assert ... # ordre n'est pas un ordre de gÚnesbksl-nl n = len(ordre)bksl-nl nb = 0bksl-nl if ordre[...] != 1: # le premier n'est pas 1bksl-nl nb = nb + 1bksl-nl i = 0bksl-nl while i < ...:bksl-nl if ... not in [-1, 1]: # l'écart n'est pas 1bksl-nl nb = nb + 1bksl-nl i = i + 1bksl-nl if ordre[...] != n: # le dernier n'est pas nbksl-nl nb = nb + 1bksl-nl return nbbksl-nlbksl-nl



Solution

###
def estpy-undunpy-undordre(tab):bksl-nl '''bksl-nl Renvoie True si tab est de longueur n et contient tous les entiersbksl-nl de 1 à n, False sinonbksl-nl '''bksl-nl for i in range(1, len(tab)+1):bksl-nl if i not in tab:bksl-nl return Falsebksl-nl return Truebksl-nlbksl-nlbksl-nldef nombrepy-undpointspy-undrupture(ordre):bksl-nl '''bksl-nl Renvoie le nombre de point de rupture de ordre qui représente un ordrebksl-nl de gÚnes de chromosomebksl-nl '''bksl-nl assert estpy-undunpy-undordre(ordre) # ordre n'est pas un ordre de gÚnesbksl-nl n = len(ordre)bksl-nl nb = 0bksl-nl if ordre[0] != 1: # le premier n'est pas 1bksl-nl nb = nb + 1bksl-nl i = 0bksl-nl while i < n-1:bksl-nl if ordre[i+1] - ordre[i] not in [-1, 1]: # l'écart n'est pas 1bksl-nl nb = nb + 1bksl-nl i = i + 1bksl-nl if ordre[n-1] != n: # le dernier n'est pas nbksl-nl nb = nb + 1bksl-nl return nbbksl-nlbksl-nl



Exemple :

🐍 Script Python
    >>> 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