TirageAuSort/tirage.py
2023-12-22 15:50:28 +01:00

66 lines
2.3 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ----------------------------------------------------------------------------
# Created By : Yannick Le Duc
# Created Date: 2023/12/22
# version ='1.0'
import os
import time
import random
import datetime
date_tirage = datetime.datetime.now()
# soit on affiche en temps réel les permutations (avec un timer) => mettre à True
# soit on affiche que le résultat final => mettre à False
affichage_temps_réel = True
# liste des participants (1 participant distinct par ligne)
# ATTENTION : pas d'homonymes possibles
participants = """
TODO : REMPLACER ICI PAR LA LISTE DES PARTICIPANTS, 1 PAR LIGNE
"""
# on met ça dans une liste triée : ce sont les donneurs
donneurs = participants.strip().splitlines()
donneurs.sort() # petit tri alphabétique pour faire joli
# au début, on initialise la liste des receveurs avec arbitrairement que chaque donneur donne à celui qui le suit dans la liste
receveurs = { donneur : donneurs[(i +1 )%len(donneurs)] for i, donneur in enumerate(donneurs) }
# et après on fait plein de mélanges/permutations
compteur = 0
while compteur < 1024: # 1024 par ex ;-)
# on permute aléatoirement 2 receveurs
random1 = random.randint(0, len(donneurs)-1)
random2 = random.randint(0, len(donneurs)-1)
if ( receveurs[ donneurs[random2] ] == donneurs[random1] ) or \
( receveurs[ donneurs[random1] ] == donneurs[random2] ) :
# on saute/annule cette permutation si cela reviendrait à ce que le donneur et le receveur soit identique
continue
compteur += 1
# on permute
temporaire = receveurs[ donneurs[random1] ]
receveurs[ donneurs[random1] ] = receveurs[ donneurs[random2] ]
receveurs[ donneurs[random2] ] = temporaire
if affichage_temps_réel:
# on affiche tout cela en faisant un clear screen avant
os.system("clear" if os.name == 'posix' else "cls")
print(f"Itération #{compteur}\n")
for donneur, receveur in receveurs.items():
print(f"{donneur:>20} donne à {receveur:20}")
time.sleep(0.006)
if not affichage_temps_réel:
print(f"Itération #{compteur}\n")
for donneur, receveur in receveurs.items():
print(f"{donneur:>20} donne à {receveur:20}")
# Fini !
print(f"\nTirage effectué le {date_tirage}")