Aller au contenu

Tête de série⚓︎

L'organisateur d'un tournoi sportif souhaite déterminer le nom du joueur participant le mieux classé dans le classement international.

Les classements des joueurs sont des entiers tous distincts et compris entre 1 et len(classement).

Il connait donc le nom des participants au tournoi, donné sous forme d'une liste, ainsi que le classement, donné sous forme d'un dictionnaire.

Par exemple :

🐍 Script Python
participants = ['Stefanos', 'Rafael', 'David', 'Novak']
classement = {'Novak': 1, 'Daniil': 2, 'Alexander': 3, 'Stefanos': 4, 'Rafael': 5}

Comme on peut le voir dans l'exemple :

  • tous les joueurs classés ne sont pas obligatoirement inscrits au tournoi (ici Daniil et Alexander ne participent pas)
  • certains participants au tournoi, invités d'honneur, n'ont pas de classement (David ici)... On considèrera donc qu'ils sont moins bien classés que n'importe lequel des joueurs classés

Vous devez écrire une fonction tete_de_serie(participants, classement) prenant en arguments la liste des joueurs inscrits au tournoi ainsi que le classement et renvoyant le prénom du joueur le mieux classé.

Il y a plusieurs solutions, par exemple :

  • Proposition 1 : donner un classement arbitraire aux participants non classés et les comparer avec les joueurs classés

  • Proposition 2 : filtrer la liste des participants afin de ne conserver que les joueurs classés :

    • si cette liste est vide, le tournoi ne compte que des participants non classés. La tête de série est donc le premier joueur
    • sinon, il est inutile de considérer les non-classés, la tête de série sera obligatoirement un joueur classé

Attention

Le dictionnaire classement ne devra pas être modifié lors de l'exécution de la fonction

Si le tournoi ne comporte que des joueurs non classés, la fonction renverra le prénom du premier joueur de la liste.

Exemples

🐍 Console Python
>>> classement = {'Novak': 1, 'Daniil': 2, 'Alexander': 3, 'Stefanos': 4, 'Rafael': 5}
>>> participants = ['Stefanos', 'Novak', 'Rafael']
>>> tete_de_serie(participants, classement)
'Novak'
>>> participants = ['Stefanos', 'Rafael', 'David', 'Novak']
>>> tete_de_serie(participants, classement)
'Novak'
>>> participants = ['David', 'Novak', 'Alexander', 'Daniil']
>>> tete_de_serie(participants, classement)
'Novak'
>>> participants = ['David', 'Olivier']
>>> tete_de_serie(participants, classement)
'David'
# Testsbksl-nl# Tous les joueurs classésbksl-nlclassement = {"Novak": 1, "Daniil": 2, "Alexander": 3, "Stefanos": 4, "Rafael": 5}bksl-nlparticipants = ["Stefanos", "Novak", "Rafael"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classébksl-nlparticipants = ["Stefanos", "Rafael", "David", "Novak"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classé (bis)bksl-nlparticipants = ["David", "Novak", "Alexander", "Daniil"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Que des joueurs non-classésbksl-nlparticipants = ["David", "Olivier"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "David"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nlbksl-nl# Tests supplémentairesbksl-nl# On change de dictionnairebksl-nlclassement = {"Navok": 4, "Dinaal": 5, "Alexandre": 2, "Stephane": 3, "Raphaël": 1}bksl-nl# Dictionnaire/classement videbksl-nlassert tetepy-unddepy-undserie(["David", "Rafael"], {}) == "David"bksl-nl# Tests - Que des joueurs non-classésbksl-nlparticipants = ["Dave", "Oliver"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Dave"bksl-nlassert classement == {bksl-nl "Navok": 4,bksl-nl "Dinaal": 5,bksl-nl "Alexandre": 2,bksl-nl "Stephane": 3,bksl-nl "Raphaël": 1,bksl-nl}bksl-nl# Tests - Un joueur non-classébksl-nlparticipants = ["Dave", "Navok", "Stephane"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Stephane"bksl-nlassert classement == {bksl-nl "Navok": 4,bksl-nl "Dinaal": 5,bksl-nl "Alexandre": 2,bksl-nl "Stephane": 3,bksl-nl "Raphaël": 1,bksl-nl}bksl-nl# Tests - Que des joueurs classésbksl-nlparticipants = ["Navok", "Stephane", "Daniil", "Raphaël"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Raphaël"bksl-nlassert classement == {bksl-nl "Navok": 4,bksl-nl "Dinaal": 5,bksl-nl "Alexandre": 2,bksl-nl "Stephane": 3,bksl-nl "Raphaël": 1,bksl-nl}bksl-nlbksl-nl ∞/∞

def tetepy-unddepy-undserie(participants, classement):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nl# Tous les joueurs classésbksl-nlclassement = {"Novak": 1, "Daniil": 2, "Alexander": 3, "Stefanos": 4, "Rafael": 5}bksl-nlparticipants = ["Stefanos", "Novak", "Rafael"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classébksl-nlparticipants = ["Stefanos", "Rafael", "David", "Novak"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classé (bis)bksl-nlparticipants = ["David", "Novak", "Alexander", "Daniil"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Que des joueurs non-classésbksl-nlparticipants = ["David", "Olivier"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "David"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nldef tetepy-unddepy-undserie(participants, classement):bksl-nl # Initialisationbksl-nl meilleurpy-undjoueur = participants[0]bksl-nl if meilleurpy-undjoueur in classement:bksl-nl meilleurpy-undclassement = classement[meilleurpy-undjoueur]bksl-nl else:bksl-nl meilleurpy-undclassement = len(classement) + 1bksl-nlbksl-nl # Recherche de la tête de sériebksl-nl for joueur in participants:bksl-nl if joueur in classement and classement[joueur] < meilleurpy-undclassement:bksl-nl meilleurpy-undjoueur = joueurbksl-nl meilleurpy-undclassement = classement[meilleurpy-undjoueur]bksl-nlbksl-nl return meilleurpy-undjoueurbksl-nlbksl-nlbksl-nl# Testsbksl-nl# Joueurs classésbksl-nlclassement = {"Novak": 1, "Daniil": 2, "Alexander": 3, "Stefanos": 4, "Rafael": 5}bksl-nlparticipants = ["Stefanos", "Novak", "Rafael"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classébksl-nlparticipants = ["Stefanos", "Rafael", "David", "Novak"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classé (bis)bksl-nlparticipants = ["David", "Novak", "Alexander", "Daniil"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Que des joueurs non-classésbksl-nlparticipants = ["David", "Olivier"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "David"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl

A

Commentaires⚓︎

Le problème revient à sélectionner le minimum dans une liste. Deux subtilités toutefois :

  • la liste contient les "étiquettes" des données à comparer (les prénoms des joueurs alors que l'on compare les classements)
  • certains joueurs n'ont pas de classement : on utilise alors une valeur par défaut supérieure au plus grand classement possible

Une solution possible⚓︎

{{ IDE('exo_corr') }}

On vérifie tout d'abord que la liste comporte au moins un joueur.

On initialise ensuite la recherche en considérant que le premier joueur participant a le meilleur classement. Si ce joueur n'est pas classé, on lui donne la note de len(classement)+1.

La suite de la fonction est construite autour d'une boucle Pour chaque. On parcourt l'ensemble des participants et pour chacun on se demande :

  • est-il classé ? Si non, il ne peut pas être mieux classé que le "meilleur" actuel
  • s'il est classé, est-il mieux classé que le "meilleur" actuel ? Si oui, on met à jour les valeurs

La fonction se termine en renvoyant le prénom du joueur le mieux classé.

Autre solution⚓︎

Si l'on commence par trier les participants entre joueurs classés et non classés, on peut faire :

🐍 Script Python
def tete_de_serie(participants, classement):
    participants_classes = [joueur for joueur in participants if joueur in classement]
    if participants_classes == []:
        meilleur_joueur = participants[0]
    else:
        meilleur_joueur = participants_classes[0]
        for joueur in participants_classes:
            if classement[meilleur_joueur] > classement[joueur]:
                meilleur_joueur = joueur
    return meilleur_joueur

Z

Retour en haut de la page