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 :
scores_1 = [13, 15, 12, 3, 19, 7, 14]
scores_2 = [27, 35, 14, 35, 3, 26, 9]
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 max1
≥max2
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 :
if x is None:
...
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 siv
>max1
, on met à jourmax1
etmax2
. - Sinon, si
max2
n'est pas définie ou siv
est plus grande, on met à jourmax2
.
- Si
Exemples
>>> 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)
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 :
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 :
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