24-NSI0A-2

  1. def corrige(cop, corr):
        return [cop[i] == corr[i] for i in range(len(cop))]
    

    Ou plus simplement :

    def corrige(cop, corr):
        resultat = []
        for i in range(len(cop)):
            resultat.append(cop[i] == corr[i])
        return resultat
    
  2. def note(cop, corr):
        total = 0
        for i in range(len(cop)):
            if cop[i] == corr[i]:
                total += 1
        return total
    
  3. def note_paquet(p, corr):
        return {nom: note(cop, corr) for nom, cop in p.items()}
    

    Ou plus simplement :

    def note_paquet(p, corr):
        resultat = {}
        for nom, cop in p.items():
            resultat[nom] = note(cop, corr)
        return resultat
    
  4. Non, une liste étant mutable, elle ne peut pas être utilisée comme clé dans un dictionnaire. Une clé doit impérativement être immutable (comme un tuple ou une chaîne) car elle doit être hachable.

  5. On peut attribuer un identifiant unique (INE par exemple) à chaque candidat et de l'utiliser comme clé.

  6. L'appel renvoie :

    ((('Tom', 'Matt'), 6),
     (('Lambert', 'Ginne'), 4),
     (('Kurt', 'Jett'), 4),
     {('Carl', 'Roth'): 2, ('Ayet', 'Finzerb'): 3})
    
  7. Cette fonction renvoie un tuple de quatre éléments :

    • Les trois meilleurs candidats triés par note décroissante.
    • Un dictionnaire regroupant tous les autres candidats.

    Chaque candidat est représenté par un tuple ((nom, prenom), note).

  8. Dans le cas où le dictionnaire contient \(n < 3\) candidats, cette fonction renvoie :

    • Les candidats triés par note décroissante.
    • \(3 - n\) valeurs None.
    • Un dictionnaire vide.
  9. def classement(notes):
        candidats = []
        while notes:
            a, b, c, notes = enigme(notes)
            candidats += [candidat for candidat in (a, b, c) if candidat]
        return candidats
    
  10. def renote_express2(copcorr):
        gauche = 0
        droite = len(copcorr)
        while droite - gauche > 1:
            milieu = (gauche + droite) // 2
            if copcorr[milieu]:
                gauche = milieu
            else:
                droite = milieu
    
        if copcorr[gauche]:
            return droite
        else:
            return gauche
    
  11. En notant \(n\) la taille de la liste, la fonction renote_express qui repose sur un simple parcours de la liste est de complexité en temps linéaire \(O(n)\) et renote_express2 qui repose sur une recherche dichotomique est de complexité en temps logarithmique \(O(\log n)\).

  12. def renote_express3(copie, correction):
        gauche = 0
        droite = len(copie)
        while droite - gauche > 1:
            milieu = (gauche + droite) // 2
            if copie[milieu] == correction[milieu]:
                gauche = milieu
            else:
                droite = milieu
    
        if copie[gauche] == correction[gauche]:
            return droite
        else:
            return gauche