1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| class Classroom:
def __init__(self, max_students, max_diff):
self.students = []
self.max_students = max_students
self.max_diff = max_diff
def can_accommodate(self, student):
girls = len([s for s in self.students if s[1] == 'F'])
boys = len([s for s in self.students if s[1] == 'M'])
if len(self.students) < self.max_students:
diff_after_adding = abs(girls - boys + (1 if student[1] == 'F' else -1))
return diff_after_adding <= self.max_diff
return False
def add_student(self, student):
if self.can_accommodate(student):
self.students.append(student)
return True
return False
class School:
def __init__(self, max_per_class, max_diff):
self.classrooms: list[Classroom] = []
self.max_per_class = max_per_class
self.max_diff = max_diff
def distribute_students(self, students):
for student in students:
placed = False
for classroom in self.classrooms:
if classroom.add_student(student):
placed = True
break
if not placed:
new_classroom = Classroom(self.max_per_class, self.max_diff)
new_classroom.add_student(student)
self.classrooms.append(new_classroom)
def redistribute_students(self, min_students):
subminimal_students = []
for classroom in self.classrooms:
if len(classroom.students) < min_students:
subminimal_students.extend(classroom.students)
self.classrooms = [classroom for classroom in self.classrooms if len(classroom.students) >= min_students]
for student in subminimal_students:
placed = False
for classroom in self.classrooms:
if classroom.add_student(student):
placed = True
break
if not placed:
pass
self.classrooms = [c for c in self.classrooms if c.students]
def print_classrooms(self):
for i, classroom in enumerate(self.classrooms, 1):
num_girls = len([s for s in classroom.students if s[1] == 'F'])
num_boys = len([s for s in classroom.students if s[1] == 'M'])
print(f"Classe {i}: {len(classroom.students)} élèves (Filles: {num_girls}, Garçons: {num_boys})")
for student in classroom.students:
print(f" - {student[0]} ({student[1]})")
students_list = (
("Jean", "M"),
("Enzo", "M"),
("Juliette", "F"),
("Blanche", "F"),
("Aurore", "F"),
("Gabriel ", "M"),
("Marc", "M"),
("Manon", "F"),
("Emma", "F"),
("Ulysse", "M"),
("Kevin", "M"),
("Iris", "F"),
("Jeremy", "M"),
("Michel", "M"),
("Noemie", "F"),
("Axel", "M"),
("Yanis", "M"),
("Solene", "F"),
("Alice", "F"),
("Valerie", "F"),
)
school = School(max_per_class=10, max_diff=4)
school.distribute_students(students_list)
school.redistribute_students(min_students=4)
school.print_classrooms() |
Partager