La cacahuète de Noël (avec morceau de code offert)
Peut-être que ce week-end, vous irez chez papy-mamy voir si, par le plus grand des hasards, Saint-Nicolas est passé. Peut-être y aura-t-il là-bas toute votre fratrie, vos neveux et nièces, et la vieille tante Bernadette. Et peut-être qu’entre deux cuberdons volés à la dérobée dans l’assiette débordante de spéculoos, de lards et de bûchettes au coco*, viendra la question fatidique posée par votre beau-frère : “On fait une cacahuète à Noël, cette année?”.
La tradition de la cacahuète de Noël [belgicisme pour désigner les cadeaux Noël par tirage au sort, dit aussi Père Noël Secret ou Noël canadien dans les pays francophones, n.d.l.r.], on la connaît depuis l’école primaire, quand notre institutrice de 3ème a écrit les noms de tous les élèves sur des petits papiers, qu’elle les a mélangés dans un chapeau et qu’on a dû piocher un copain. On se souvient du petit bracelet en perles qu’on a fabriqué pour Nancy et du puzzle de la grand’place de Bruxelles offert par Pietro et qui prend encore la poussière dans l’armoire à jeu (le puzzle, pas Pietro). On a réitéré l’expérience au lycée, entre copines et même en famille avec plus ou moins de bonheur. Parce que si le grand principe de la cacahuète est que chacun offre un cadeau et que chacun en reçoive un, il n’est pas toujours compatible avec l’essence de Noël : gâter ceux qu’on aime.
Déontologiquement — pour la paix des ménages — on ne peut pas dire “Attends, enlève le papier de tante Bernadette avant que je pioche dans le chapeau”. Ou alors : “Je suis tombée sur ma grande soeur l’an passé, donc j’aimerais tomber sur ma petite soeur cette année”.
Si le chapeau pouvait parler, il m’enverrait paître.
La solution? Ne plus utiliser de chapeau. Ni de petits papiers.
La solution, c’est de créer un algorithme qui fasse le job à notre place. Démonstration.
D’abord, m’explique Malian qui travaille chez EURA NOVA, on va faire la liste des contraintes que l’on doit appliquer:
- la répartition des paires (donneur, receveur) doit être aléatoire
- tout le monde doit offrir 1 cadeau
- chacun doit recevoir 1 cadeau
- on veut réaliser une “chaîne de cadeau”
Ensuite, on énumère les personnes qui participent à la cacahuète. Partons d’un exemple simple de trois personnes, Maryse et ses soeurs.
people : [Evelyne, Maryse, Fany]
On veut un algorithme réutilisable année après année. Dès lors, on applique une fonction “shuffle” sur notre série de People. C’est donc la même fonction qu’utilise votre application musicale préférée en mode lecture aléatoire.
shuffled: Shuffle (people)
Pour une série de 3 éléments, il existe 6 combinaisons.
[Evelyne, Maryse, Fany]
[Evelyne, Fany, Maryse]
[Maryse, Evelyne, Fany]
[Maryse, Fany, Evelyne]
[Fany, Evelyne, Maryse]
[Fany, Maryse, Evelyne]
Bien sûr, plus il y a d’éléments dans la liste, plus il existe de combinaisons. Et pour les calculer, c’est facile, il suffit de se souvenir de ses cours de math du lycée et des factorielles (ne culpabilisez pas trop si vous avez oublié, c’est la touche [ ! ] de votre Casio qui a surtout chauffé à l’époque)
2! = 2 x 1 = 2
3! = 3 x 2 x 1 = 6
4! = 4 x 3 x 2 x 1 = 24
Et si l’on poursuit pour obtenir les combinaisons possibles pour les 15 invités de la fête de Noël on obtient
15! = 1 307 674 368 000
On peut voir venir quelques Noël, pas vrai?
Donc pour le moment, on a :
people [Evelyne, Maryse, Fany]
shuffled : Shuffle (people): [Fany, Evelyne, Maryse]
A présent, il faut définir qui offre à qui en s’assurant que les 4 contraintes soient bien respectées. On va appliquer une fonction rotative où chaque élément placé en n prend la place n+1 (et le dernier élément prendra la place du premier). De cette façon, on obtiendra une boucle dont personne n’est écarté.
Donc, si Fany est 1, Evelyne est 2, Maryse est 3, alors Fany devient 2, Evelyne devient 3 et Maryse devient 1.
rotated : Rotation (shuffled): [Maryse, Fany, Evelyne]
Pour terminer, il suffit d’apparier les éléments un à un tel que
partners: Zip (shuffled, rotated)
Ainsi, Fany offre un cadeau à Maryse, Evelyne offre à Fany et Maryse offre à Evelyne.
Et l’an prochain, on partira d’un autre shuffle pour avoir un autre jumelage, comme par exemple:
people [Evelyne, Maryse, Fany]
shuffled : Shuffle (people): [Evelyne, Fany, Maryse]
rotated : Rotation (shuffled) : [Maryse, Evelyne, Fany]
Evelyne offre à Maryse, Fany offre à Evelyne et Maryse offre à Fany.
Amusant, non? Et encore, c’est juste l’algorithme de base (dont vous trouverez le code ici pour tirer votre propre cacahuète familiale) que vous pouvez personnaliser à votre guise en ajoutant des contraintes :
- je ne veux pas tomber sur tante Bernadette
- les beaux-frères doivent s’offrir des cadeaux entre eux
- mon père veut offrir à ma mère
- etc.
En deux trois fonctions toutes bêtes, on a créé un algorithme pour pallier la tâche fastidieuse des petits papiers dans le chapeau. L’algorithmique fait partie de la data science, comme les statistiques, la visualisation ou les mathématiques. On aura l’occasion de revenir sur chaque facette dans de prochains articles. Ici, ce qui est intéressant, c’est la manière dont on a découpé le problème et la succession des règles qui permettent sa résolution. Dans les entreprises, toute tâche fastidieuse et répétitive peut potentiellement se faire remplacer par un algorithme.
Restons dans les cacahuètes. Il n’y a pas de petit bonhomme qui mets les M&M’s dans les pochettes jaunes (par contre il y a une marmotte qui emballe les tablettes de chocolat, comme tout le monde le sait). Une jaune, une bleue, une verte, une rouge, une brune, et on recommence. Non.
Par contre, on peut facilement imaginer des fonctions Shuffle, Rotation et Zip sur les flux colorés de cacahuètes enrobées pour qu’il y ait, au final, un panaché de M&M’s dans les paquets. En effet, on n’a jamais vu un paquet de M&M’s avec 4 cacahuètes de chaque couleur (ni de paquet de dragibus ou de biscuits apéritifs avec une répartition équivalente des formes et des couleurs). Les industriels utilisent donc ces fonctions aléatoires et de rotation pour empaqueter leurs productions.
Remplacer les tâches fastidieuses par un algorithme. Le Graal de notre décennie.
Et vous, quelle tâche de votre quotidien voudriez-vous voir transformée en quelques fonctions? Partagez vos idées. Malian adore les défis!
*Ami lecteur non-belge, si tu me lis, viens visiter mon plat pays pour goûter à ces merveilles du terroir de la betterave sucrière.