Le jeu du cadeau mystère de Noël? Kézako ? À en croire les publicités à la télévision (que je ne regarde presque jamais), c’est bientôt Noël (ben oui! faut bien plumer le pigeons dès qu’on le peut… au cas où ils n’auraient plus d’argent en Décembre!).

Il y a quelques années, ma nièce, qui a toujours des idées à la con, mais que j’aime toujours autant, a eu la magnifique idée de lancer ce jeu qui consiste à ne faire qu’un cadeau à une personne choisie au hasard. Bien entendu, il faut que ce soit un secret: personne n’a le droit de dire à qui il ou elle a fait un cadeau… même si dans la pratique, tout le monde devine!

cadeau mystère noël

La première année, elle a fait le tirage au sort à la main… Pfff! Elle croyait que l’on vivait encore au Moyen-Âge ou quoi ? Je lui ai donc proposé de m’occuper de tout ça en faisant un petit programme Python.

Cadeau mystère de Noël: le principe

C’est pas sorcier: on a une liste de personnes et il faut créer un dictionnaire dont les clés sont ces personnes, et les valeurs doivent être les autres personnes. la contrainte est ici qu’une valeur ne peut pas être la clé et que chaque valeur est unique.

Bon, c’est pas trop difficile! Voici une fonction qui est pas trop mal:

from random import choice
L = list('ABCDEFGH')

def switch(L):
    D = {}
    for i in L:
        T = [ j for j in L if j not in D.values() and j != i ]
        D[i] = choice(T)
        
    return D

Pour simplifier, j’ai nommé “A”, “B”, …, “H” les personnes. Mais bien sûr, vous pouvez remplacer la ligne 2 par ce que vous voulez:

L = [ 'Cunégonde', 'Tartuffe', 'Jean-Kévin', 'Mimosa' ]

Le principe de la fonction est le suivant: T est une liste composé d’éléments “j” qui sont dans L mais qui ne sont pas encore dans le dictionnaire D (qui est initialement vide et qui se remplit au fur et à mesure que l’on parcourt la liste L) de sorte que les valeurs ne soient pas égales à leur clé (ça, c’est la ligne 7).

Pour la première année, ça marchait.

Cadeau mystère de Noël: le retour

Pour le Noël suivant, il fallait s’assurer que les valeurs soient mélangées de sorte à ce que chaque personne ait un destinataire différent de l’année précédente. En effet, il serait fort regrettable que Mimosa ait à offrit à Jean-Kévin un cadeau deux années consécutives… Surtout que Mimosa ne peut pas voir en peinture ce Jean-Kéké, qui ne peut pas s’empêcher de faire des blagues lourdingues à chaque fois qu’ils se voient! (bon, là, c’est pour l’humour car j’ai la chance d’avoir autour de moi des personnes qui s’adorent)

On va donc réécrire la fonction:

from random import shuffle

def reswitch(D):
    keys = list(D.keys())
    values = list(D.values())

    while True:
        shuffle(values)
        # Vérifie que :
        # 1. Aucune valeur n'est égale à sa clé
        # 2. Aucune valeur n'est égale à la valeur originale de sa clé
        if all(v != k and v != D[k] for k, v in zip(keys, values)):
            break

    new_D = {k: v for k, v in zip(keys, values)}
    return new_D

Et voilà! Le tour est joué!

C’est tout pour moi…

Catégories : Python

0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x