Aller au contenu

Deux meilleurs scores⚓︎

Vous venez de développer Flap Flap Bird, un jeu très dur où il faut aider un oiseau à éviter des obstacles. À la fin de la partie, vous voulez afficher les deux meilleurs scores du joueur. Ces deux meilleurs scores peuvent être égaux.

On considère les deux listes de scores suivants :

🐍 Script Python
scores_1 = [13, 15, 12, 3, 19, 7, 14]
scores_2 = [27, 35, 14, 35, 3, 26, 9]
Pour score_1, les deux meilleurs scores sont 19 et 14. Pour score_2, ce sont 35 et 35.

Si la liste de scores ne contient pas assez de valeurs, les meilleurs valeurs manquantes sont remplacées par None.

Compléter le code de la fonction deux_meilleurs qui prend un liste d'entiers scores et renvoie le couple formé par les deux meilleurs valeurs max1 et max2, avec max1max2 si aucun des deux ne vaut None.

Contraintes

On n'utilisera ni max, ni min, ni sort, ni sorted.

La valeur None

None est une valeur spéciale utilisée en Python et qui correspond à un manque de valeur normale. Lorsque l'exécution d'une fonction se termine sans avoir rencontré un return, Python renvoie automatiquement la valeur None.

On peut tester si une variable x contient la valeur None de la manière suivante :

🐍 Script Python
if x is None:
    ...
On pourrait également tester x == None mais si x est un objet d'une classe dans laquelle l'égalité a été redéfinie, l'égalité peut être vraie, alors que x is None ne l'est pas.

Indications

L'algorithme fonctionne de la manière suivante :

  • On parcourt toutes les valeurs de la liste.
  • À chaque nouvelle valeur v on étudie les cas suivants :
    • Si max1 n'est pas définie ou si v > max1, on met à jour max1 et max2.
    • Sinon, si max2 n'est pas définie ou si v est plus grande, on met à jour max2.

Exemples

🐍 Console Python
>>> scores_1 = [13, 15, 12, 3, 19, 7, 14]
>>> deux_meilleurs(score_1)
(19, 15)
>>> scores_2 = [27, 35, 14, 35, 3, 26, 9]
>>> deux_meilleurs(score_2)
(35, 35)
>>> deux_meilleurs([4, 5])
(5, 4)
>>> deux_meilleurs([5, 4])
(5, 4)
>>> deux_meilleurs([5, 5])
(5, 5)
>>> deux_meilleurs([9])
(9, None)
>>> deux_meilleurs([])
(None, None)
# testsbksl-nlscorespy-und1 = [13, 15, 12, 3, 19, 7, 14]bksl-nlassert deuxpy-undmeilleurs(scorespy-und1) == (19, 15)bksl-nlscorespy-und2 = [27, 35, 14, 35, 3, 26, 9]bksl-nlassert deuxpy-undmeilleurs(scorespy-und2) == (35, 35)bksl-nlassert deuxpy-undmeilleurs([4, 5]) == (5, 4)bksl-nlassert deuxpy-undmeilleurs([5, 4]) == (5, 4)bksl-nlassert deuxpy-undmeilleurs([5, 5]) == (5, 5)bksl-nlassert deuxpy-undmeilleurs([9]) == (9, None)bksl-nlassert deuxpy-undmeilleurs([]) == (None, None)bksl-nlbksl-nl# autres testsbksl-nlassert deuxpy-undmeilleurs([7]) == (7, None)bksl-nlassert deuxpy-undmeilleurs([1, 2]) == (2, 1)bksl-nlassert deuxpy-undmeilleurs([2, 1]) == (2, 1)bksl-nlassert deuxpy-undmeilleurs([-9, -3]) == (-3, -9)bksl-nlassert deuxpy-undmeilleurs([8, -3]) == (8, -3)bksl-nlassert deuxpy-undmeilleurs([1, 1]) == (1, 1)bksl-nlassert deuxpy-undmeilleurs([1, 1, 1, 1]) == (1, 1)bksl-nlassert deuxpy-undmeilleurs([1, 0, 1, 1]) == (1, 1)bksl-nlassert deuxpy-undmeilleurs([9, 8, 7, 6, 5]) == (9, 8)bksl-nlassert deuxpy-undmeilleurs([1, 2, 3, 4, 5]) == (5, 4)bksl-nlassert deuxpy-undmeilleurs([4, 5, 2, 5, 1, 2]) == (5, 5)bksl-nlassert deuxpy-undmeilleurs([9, 3, 2, 1, 5]) == (9, 5)bksl-nlassert deuxpy-undmeilleurs([2, 9, 3, 4, 5]) == (9, 5)bksl-nlbksl-nl ∞/∞

def deuxpy-undmeilleurs(scores):bksl-nl max1, max2 = None, Nonebksl-nl for v in scores:bksl-nl if max1 is None or ...:bksl-nl max1, max2 = ..., ...bksl-nl elif ... or ...:bksl-nl ...bksl-nl return ..., ...bksl-nlbksl-nl# testsbksl-nlscorespy-und1 = [13, 15, 12, 3, 19, 7, 14]bksl-nlassert deuxpy-undmeilleurs(scorespy-und1) == (19, 15)bksl-nlscorespy-und2 = [27, 35, 14, 35, 3, 26, 9]bksl-nlassert deuxpy-undmeilleurs(scorespy-und2) == (35, 35)bksl-nlassert deuxpy-undmeilleurs([4, 5]) == (5, 4)bksl-nlassert deuxpy-undmeilleurs([5, 4]) == (5, 4)bksl-nlassert deuxpy-undmeilleurs([5, 5]) == (5, 5)bksl-nlassert deuxpy-undmeilleurs([9]) == (9, None)bksl-nlassert deuxpy-undmeilleurs([]) == (None, None)bksl-nlbksl-nldef deuxpy-undmeilleurs(scores):bksl-nl max1, max2 = None, Nonebksl-nl for v in scores:bksl-nl if max1 is None or v > max1:bksl-nl max1, max2 = v, max1bksl-nl elif max2 is None or v > max2:bksl-nl max2 = vbksl-nl return max1, max2bksl-nlbksl-nl

A

Commentaires⚓︎

Autre version⚓︎

Dans le premier test, on peut aussi faire une inégalité large :

🐍 Script Python
def deux_meilleurs(scores):
    max1, max2 = None, None
    for v in scores:
        if max1 is None or v >= max1:
            max1, max2 = v, max1
        elif max2 is None or v > max2:
            max2 = v
    return max1, max2

Version sans tester None⚓︎

On peut faire une façon plus proche d'une recherche de maximum classique :

🐍 Script Python
def deuxieme_max(scores):
    if len(scores) == 0:
        return None, None
    elif len(scores) == 1:
        return scores[0], None
    if scores[0] > scores[1]:
        max1, max2 = scores[0], scores[1]
    else:
        max1, max2 = scores[1], scores[0]
    for i in range(2, len(scores)):
        if scores[i] > max1:
            max2 = max1
            max1 = scores[i]
        elif scores[i] > max2:
            max2 = scores[i]
    return max1, max2

Valeurs distinctes⚓︎

Si on veut avoir deux valeurs strictement différentes, il faut faire un peu plus attention lors du deuxième test dans la boucle. Mais ce sera l'objet d'un autre exercice.

Z

Retour en haut de la page