# ========================================================= # Génération de la grille de roulement des TP en Python # pour 15 élèves avec 5 TP en 5 séances # www.gecif.net # Juin 2026 # ========================================================= import itertools # --- CONFIGURATION INITIALE --- # En Python 3.2, la génération par compréhension simple fonctionne parfaitement ELEVES = [chr(65 + i) for i in range(15)] # ['A', 'B', 'C', ..., 'O'] TRIOS_POSSIBLES = list(itertools.combinations(ELEVES, 3)) # Structure de la grille : 5 lignes (TP), 5 colonnes (Séances) grille = [[None for _ in range(5)] for _ in range(5)] def est_valide(trio, ligne, col): """Vérifie si le trio peut être placé dans la case (ligne, col).""" # 1. Vérification par ligne (TP) for c in range(5): if grille[ligne][c] is not None: # Remplacement de 'any()' par une boucle explicite pour la clarté et la compatibilité ancienne for eleve in trio: if eleve in grille[ligne][c]: return False # 2. Vérification par colonne (Séance) for l in range(5): if grille[l][col] is not None: for eleve in trio: if eleve in grille[l][col]: return False # 3. Vérification du brassage des duos duos_du_trio = list(itertools.combinations(trio, 2)) for l in range(5): for c in range(5): if grille[l][c] is not None: if l == ligne and c == col: continue for duo in duos_du_trio: if duo[0] in grille[l][c] and duo[1] in grille[l][c]: return False return True def resoudre(index_case=0): """Algorithme de Backtracking pour remplir la grille case par case.""" if index_case == 25: return True ligne = index_case // 5 col = index_case % 5 for trio in TRIOS_POSSIBLES: if est_valide(trio, ligne, col): grille[ligne][col] = trio if resoudre(index_case + 1): return True grille[ligne][col] = None return False # --- EXÉCUTION ET AFFICHAGE --- if resoudre(): print("--- TABLEAU DE ROULEMENT GÉNÉRÉ ---") # Utilisation de la méthode .format() compatible Python 3.2 pour l'alignement du texte entete = "{0:<8} | {1:<10} | {2:<10} | {3:<10} | {4:<10} | {5:<10}".format( "", "Séance 1", "Séance 2", "Séance 3", "Séance 4", "Séance 5" ) print(entete) print("-" * 75) for i in range(5): ligne_str = "TP {0:<4} | ".format(i + 1) for j in range(5): trio = grille[i][j] trio_str = "{0},{1},{2}".format(trio[0], trio[1], trio[2]) ligne_str += "{0:<10} | ".format(trio_str) print(ligne_str[:-3]) else: print("Aucune solution trouvée avec ces contraintes.")