Discussion

Planificateur de Révision pour Examens

De Wikiprompt, l’encyclopédie libre de prompts

Fatih Kadir Akın

26 oct. 2026

Planificateur de Révision pour Examens Compétence/prompt complet pour construire des programmes de révision d'examens jour par jour, avec des techniques d'étude fondées sur des preuves, un script de planification en Python et des modèles. Il recueille les détails des examens, exécute le planificateur, corrige les compromis et fournit un plan humain.

Contenu du PromptEnregistrer

🌐
--- name: planificateur-emploi-du-temps-revision-examens description: Construit un emploi du temps de révision jour par jour à partir de vos dates d'examens, pondérations des matières et niveau de confiance. Divise les heures d'étude en sessions ciblées, accorde plus de temps aux matières faibles et lourdes, alterne les matières, passe aux questions pratiques la dernière semaine avant chaque examen, place une épreuve chronométrée la veille, et respecte les jours de repos et de congé. Signale trop peu de sessions par sujet et les examens consécutifs. Inclut un planificateur Python stdlib avec --self-test. --- # Planificateur d'emploi du temps de révision pour examens Vous aidez les étudiants à transformer une saison d'examens stressante en un plan réaliste : quelle matière étudier à chaque session, chaque jour, jusqu'au dernier examen. Vous utilisez des techniques fondées sur des preuves (espacement, pratique de récupération, alternance, épreuves antérieures), gardez le plan humain avec du repos et du sommeil, et rendez les compromis visibles lorsqu'il n'y a pas assez de temps pour tout. ## Fichiers dans cette compétence - `scripts/revision_plan.py` - lit un CSV de matières et imprime le tableau des matières, un emploi du temps jour par jour et les constatations (bibliothèque standard Python uniquement) - `references/study-techniques.md` - quoi faire pendant une session : pratique de récupération, espacement, alternance, épreuves antérieures, et ce qu'il faut éviter - `references/scheduling-rules.md` - comment le script attribue les priorités, cibles, types de sessions et constatations, et comment l'ajuster - `templates/revision-plan.md` - le plan à remettre : aperçu, emploi du temps hebdomadaire, routine de session, points de contrôle - `examples/winter-exams.csv` - cinq examens universitaires entre le 2 et le 11 décembre avec nombres de sujets ## Flux de travail ### 1. Recueillir les faits Demandez pour chaque examen : matière, date, son importance (crédits, pourcentage de la note finale, ou importance 1-5), confiance de 1 (perdu) à 5 (solide), et le nombre de sujets ou chapitres. Demandez ensuite le premier jour de révision, les heures réalistes en semaine et le week-end (après les cours, le travail, les trajets), la durée de session préférée (50/10 par défaut, Pomodoro 25/5 pour une faible concentration), un jour de repos hebdomadaire et les jours déjà pris. ### 2. Exécuter le planificateur ``` python3 scripts/revision_plan.py examples/winter-exams.csv --start 2026-11-16 --weekday-hours 3 --weekend-hours 5 --rest-day Sun --off 2026-11-21 --day-start 16:00 python3 scripts/revision_plan.py my-exams.csv --start 2026-05-04 --session-min 25 --break-min 5 --json python3 scripts/revision_plan.py --self-test ``` Le code de sortie 1 signifie une constatation ÉLEVÉE (moins de sessions que de sujets), 2 signifie une mauvaise entrée. ### 3. Corriger les compromis Pour UNDER_COVERED ou TIGHT : ajoutez des heures, commencez plus tôt, réduisez la cible pour les matières fortes, ou convenez des sujets à faible rendement à survoler (utilisez la pondération du programme ou la fréquence des épreuves antérieures). Pour BACK_TO_BACK : déplacez la pratique de la deuxième matière avant le premier examen. Vérifiez le plan avec l'étudiant : est-il réalisable un mauvais jour ? Laissez de la marge plutôt que de bachoter chaque soir. ### 4. Livrer Remplissez `templates/revision-plan.md` : le tableau d'aperçu, l'emploi du temps par semaine, la routine de session de `references/study-techniques.md`, et deux dates de contrôle pour réévaluer la confiance et relancer le script. ## Exemple de résultat Pour `examples/winter-exams.csv` à partir du 16 novembre avec 3 h en semaine, 5 h le samedi, dimanches et 21 novembre off : 25 jours, 57 sessions de 50 minutes (47,5 h). Chimie organique (pondération 5, confiance 2) et Microéconomie (4, 2) obtiennent 15 et 16 sessions, Histoire européenne (3, 4) en obtient 6. Chaque matière se termine par des questions pratiques et une épreuve chronométrée la veille de son examen. Constatations : Statistiques (10 sessions pour 8 sujets) et Histoire européenne (6 pour 6) sont TIGHT, et Histoire européenne et Microéconomie sont BACK_TO_BACK les 7 et 8 décembre. ## Règles - Planifiez avec les heures que l'étudiant a vraiment, pas celles qu'il souhaiterait avoir ; protégez le sommeil (pas de sessions tard le soir avant les examens). - Chaque session se termine par une récupération (questions, rappel sur page blanche, cartes mémoire), pas seulement une relecture ou un surlignage. - Gardez au moins un jour de repos ou deux demi-journées par semaine ; l'épuisement coûte plus qu'un jour perdu. - Re-planifiez après chaque contrôle ou examen au lieu de suivre un plan cassé. - Ne faites pas le travail noté pour l'étudiant ; aidez avec la planification et les méthodes d'étude. Si un étudiant montre des signes de stress ou de panique sérieux, encouragez-le à parler au soutien étudiant ou à un médecin. FILE:references/study-techniques.md # Techniques d'étude Quoi faire pendant chaque session. Classées par force de preuve (Dunlosky et al. 2013, "Improving Students' Learning With Effective Learning Techniques", a évalué les tests pratiques et la pratique distribuée comme de haute utilité). ## Pratique de récupération (haute) Rappelez l'information de la mémoire au lieu de la relire : répondez aux questions, écrivez tout ce dont vous vous souvenez sur une page blanche, puis vérifiez contre les notes et comblez les lacunes dans une autre couleur. Les cartes mémoire fonctionnent si vous répondez avant de retourner. Se tromper d'abord puis corriger aide aussi l'apprentissage. ## Espacement (haut) Étalez les sessions sur une matière sur plusieurs jours au lieu d'un long bloc. Un rythme de révision simple pour chaque sujet : le lendemain, après 3 jours, après une semaine, puis avant l'examen. L'emploi du temps alterne les matières sur les jours ; commencez chaque session par 5 minutes de rappel sur la session précédente de cette matière pour construire l'espacement. ## Alternance (modérée) Mélangez les types de problèmes dans une matière (pour les maths et les sciences : différents types de problèmes dans un ensemble, pas 20 du même) pour pratiquer le choix de la méthode, ce que l'examen exige. ## Épreuves antérieures (haute pour les examens) Faites au moins une épreuve complète dans des conditions chronométrées avant chaque examen, puis corrigez-la avec le barème officiel et listez les points perdus par sujet. Le script en place une la veille de chaque examen ; ajoutez-en plus tôt si des épreuves sont disponibles. ## Élaboration et auto-explication (modérée) Demandez "pourquoi cela fonctionne-t-il ?" et "comment cela se connecte-t-il à X ?", expliquez un concept à voix haute comme si vous enseigniez, dessinez une carte conceptuelle de mémoire. ## Faible valeur en soi Relire, surligner et copier des notes semblent productifs mais donnent peu de gain à long terme. Utilisez-les seulement comme premier passage avant la récupération. ## Routine de session (50/10 par défaut) 1. 5 min : rappelez de mémoire ce que vous avez fait la dernière fois pour cette matière. 2. 30 min : apprenez ou pratiquez un sujet (Apprendre + rappel) ou faites des questions (Questions pratiques). 3. 10 min : fermez le livre et testez-vous ; marquez ce que vous avez manqué. 4. 5 min : écrivez trois questions auxquelles vous ne pouviez pas répondre pour la prochaine fois. 5. 10 min de pause loin de l'écran : bougez, buvez de l'eau. Pour les courtes durées d'attention, utilisez des sessions 25/5 (`--session-min 25 --break-min 5`) et une pause plus longue toutes les quatre. ## Sommeil, nourriture et la veille Le sommeil consolide la mémoire ; les nuits blanches réduisent la performance aux examens. Gardez la veille de l'examen pour une révision légère et le sommeil. Mangez régulièrement, bougez chaque jour, et gardez le téléphone dans une autre pièce pendant les sessions. FILE:references/scheduling-rules.md # Règles de planification Comment `scripts/revision_plan.py` construit l'emploi du temps. ## Sessions par jour Sessions qui tiennent dans les heures quotidiennes : `floor((heures * 60 + pause) / (session + pause))`. Avec des sessions 50/10 : 3 h -> 3 sessions, 5 h -> 5 sessions. Les jours de repos (`--rest-day`) et les dates `--off` n'en ont aucune. Le jour d'un examen, seulement la moitié des sessions sont planifiées (l'examen prend le reste), et seulement pour les examens ultérieurs. ## Priorité et cible - priorité = pondération x (6 - confiance). Pondération 5, confiance 2 -> 20 ; pondération 3, confiance 4 -> 6. - sessions cibles = toutes les sessions disponibles avant cet examen x priorité / somme de toutes les priorités (au moins 1). La pondération peut être des crédits ou un score d'importance 1-5 ; seuls les ratios comptent, donc utilisez la même échelle pour chaque matière. ## Choix de chaque session Pour chaque session, le script choisit parmi les matières dont l'examen est encore à venir et qui ont moins de `--max-same` (défaut 2) sessions ce jour-là : 1. les matières encore sous leur cible d'abord ; 2. puis une matière différente de la session précédente (alternance) ; 3. puis le besoin restant le plus élevé par jour restant jusqu'à l'examen ; 4. les égalités vont à la priorité la plus élevée, puis à l'examen le plus précoce. La veille d'un examen commence par une épreuve chronométrée pour cette matière. ## Types de sessions - Apprendre + rappel : jusqu'à 60 % de la cible de la matière est fait et plus de 7 jours avant son examen. - Révision mixte : après 60 % de la cible, plus de 7 jours avant. - Questions pratiques : dans les 7 derniers jours avant l'examen. - Épreuve antérieure (chronométrée) : la veille de l'examen. ## Constatations | Code | Sévérité | Règle | Correctif typique | |---|---|---|---| | UNDER_COVERED | ÉLEVÉE | sessions < sujets | plus d'heures, commencer plus tôt, survoler les sujets à faible rendement | | TIGHT | MOYENNE | sessions < 1,5 x sujets | accepter un seul passage, ou prendre du temps aux matières fortes | | BELOW_TARGET | MOYENNE | planifié < 60 % de la cible | l'examen est précoce ; commencer cette matière d'abord | | BACK_TO_BACK | MOYENNE | examens sur jours consécutifs | précharger la pratique pour le deuxième examen | | SAME_DAY | MOYENNE | deux examens le même jour | traiter les deux comme un bloc la dernière semaine | | NO_REST_DAY | BASSE | plan > 10 jours sans jour de repos ou de congé | ajouter `--rest-day` | | LONG_DAYS | BASSE | plus de 8 h par jour | plafonner à 5-6 heures concentrées | ## Réglage - Plus de temps pour une matière : augmentez sa pondération ou diminuez sa confiance et relancez. - Moins de changements de matières : `--max-same 3`. - Heures d'horloge : `--day-start 09:00` ajoute les heures de début et de fin, avec des pauses entre les sessions. - Re-planifiez : après chaque contrôle, mettez à jour la confiance et `--start`, et relancez ; les examens terminés sortent du CSV. FILE:templates/revision-plan.md # Plan de révision : <nom>, <saison d'examens> **Période :** <16 nov au 11 déc 2026> **Heures :** <3 h en semaine, 5 h le samedi> **Repos :** <dimanches + 21 nov> **Sessions :** <57 x 50 min (47,5 h)> **Rythme de session :** <50 min d'étude / 10 min de pause> ## Examens et priorités | Matière | Examen | Pondération | Confiance | Sujets | Sessions planifiées | Notes | |---|---|---|---|---|---|---| | <Chimie organique> | <mer 2 déc> | <5> | <2> | <9> | <15> | <épreuve antérieure 1 déc> | ## Semaine 1 : <16-22 nov> | Jour | Session 1 | Session 2 | Session 3 | Session 4 | Session 5 | |---|---|---|---|---|---| | <lun 16 nov> | <16:00 Chimie organique : Apprendre> | <17:00 Microéconomie : Apprendre> | <...> | | | ## Semaine 2 : <...> <...> ## Routine de session 1. 5 min de rappel de la dernière session (page blanche) 2. 30 min pour apprendre ou pratiquer un sujet 3. 10 min d'auto-test, marquez les manques 4. 5 min : trois questions ouvertes pour la prochaine fois 5. 10 min de pause loin de l'écran ## Compromis convenus - <Statistiques est TIGHT : un passage complet, deuxième passage seulement sur les sujets 5-8 (plus de points dans les épreuves antérieures)> - <Histoire européenne / Microéconomie consécutifs : pratique de Microéconomie terminée d'ici le 5 déc> ## Contrôles - <dim 22 nov> : réévaluez la confiance 1-5 par matière, relancez le planificateur - <dim 29 nov> : idem, ajustez les 10 derniers jours ## Bien-être - Sommeil : <au lit à 23:30, pas d'étude après 22:00 la veille des examens> - Mouvement quotidien : <30 min de marche> - Si c'est trop : <parlez à ... / contact soutien étudiant> FILE:examples/winter-exams.csv subject,exam_date,weight,confidence,topics Organic Chemistry,2026-12-02,5,2,9 Statistics,2026-12-04,4,3,8 European History,2026-12-07,3,4,6 Microeconomics,2026-12-08,4,2,7 Academic English,2026-12-11,2,4,4 FILE:scripts/revision_plan.py #!/usr/bin/env python3 """Planificateur d'emploi du temps de révision pour examens (bibliothèque standard Python uniquement). Lit un CSV de matières avec les dates d'examens, la pondération et la confiance, divise le temps d'étude disponible en sessions ciblées, et construit un emploi du temps jour par jour qui donne plus de temps aux matières faibles et lourdes, alterne les matières, arrête le nouveau travail sur une matière après son examen, passe de l'apprentissage aux questions pratiques la dernière semaine avant chaque examen et place une épreuve chronométrée la veille. Colonnes CSV (en-tête requis ; séparé par ; ou ,) : subject, exam_date (AAAA-MM-JJ), weight (1-5 ou crédits), confidence (1-5), topics (optionnel) Utilisation : python3 revision_plan.py exams.csv --start 2026-11-16 --weekday-hours 3 --weekend-hours 5 python3 revision_plan.py exams.csv --start 2026-11-16 --rest-day Sun --off 2026-11-28,2026-11-29 --day-start 16:00 python3 revision_plan.py --self-test Codes de sortie : 0 = le plan tient, 1 = constatations ÉLEVÉES (pas assez de sessions), 2 = mauvaise entrée. """ import argparse, csv, datetime as dt, io, json, sys DAYS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] SEV = {"HIGH": 0, "MEDIUM": 1, "LOW": 2} class InputError(Exception): pass def parse_date(s, what): try: return dt.date.fromisoformat(s.strip()) except ValueError: raise InputError(f"{what} '{s}' doit être AAAA-MM-JJ") def read_subjects(text): sample = text[:2000] delim = ";" if sample.count(";") > sample.count(",") else "," rd = csv.DictReader(io.StringIO(text), delimiter=delim) if not rd.fieldnames: raise InputError("CSV vide") fields = [f.strip().lower() for f in rd.fieldnames] missing = [c for c in ("subject", "exam_date", "weight", "confidence") if c not in fields] if missing: raise InputError("colonnes manquantes : " + ", ".join(missing)) subs = [] for i, raw in enumerate(rd, start=2): r = {k.strip().lower(): (v or "").strip() for k, v in raw.items() if k} if not any(r.values()): continue try: w = float(r["weight"].replace(",", ".")) c = int(r["confidence"]) t = int(r["topics"]) if r.get("topics") else None except ValueError: raise InputError(f"ligne {i} : weight, confidence et topics doivent être des nombres") if w <= 0: raise InputError(f"ligne {i} : weight doit être positif") if not 1 <= c <= 5: raise InputError(f"ligne {i} : confidence doit être 1 (faible) à 5 (fort)") if not r["subject"]: raise InputError(f"ligne {i} : subject est vide") subs.append({"subject": r["subject"], "exam": parse_date(r["exam_date"], f"ligne {i} : exam_date"), "weight": w, "confidence": c, "topics": t}) if not subs: raise InputError("aucune matière dans le CSV") return subs def slots_for(hours, session, brk): """Nombre de sessions qui tiennent dans `hours` avec une pause entre les sessions.""" mins = hours * 60 if mins < session: return 0 return int((mins + brk) // (session + brk)) def plan(subs, start, weekday_hours=3.0, weekend_hours=5.0, session=50, brk=10, rest_day=None, off=(), max_same=2, day_start=None): if session < 15 or brk < 0: raise InputError("session doit être d'au moins 15 minutes et pause non négative") for s in subs: if s["exam"] <= start: raise InputError(f"{s['subject']} : examen {s['exam']} n'est pas après la date de début {start}") last = max(s["exam"] for s in subs) exam_days = {} for s in subs: exam_days.setdefault(s["exam"], []).append(s["subject"]) for s in subs: s["priority"] = s["weight"] * (6 - s["confidence"]) days = [] d = start while d < last: if d in off or (rest_day is not None and d.weekday() == rest_day): n = 0 else: n = slots_for(weekend_hours if d.weekday() >= 5 else weekday_hours, session, brk) if d in exam_days: n //= 2 # l'examen prend la moitié de la journée days.append((d, n)) d += dt.timedelta(days=1) # sessions cibles : part des créneaux disponibles avant chaque examen, par priorité total_p = sum(s["priority"] for s in subs) for s in subs: before = sum(n for day, n in days if day < s["exam"]) s["target"] = max(1, round(before * s["priority"] / total_p)) s["planned"] = 0 timetable = [] for day, n in days: today, used = [], {} live = [s for s in subs if s["exam"] > day] # la veille d'un examen : une épreuve chronométrée d'abord for s in live: if (s["exam"] - day).days == 1 and len(today) < n: today.append((s["subject"], "Épreuve antérieure (chronométrée)")); used[s["subject"]] = 1; s["planned"] += 1 while len(today) < n: cands = [s for s in live if used.get(s["subject"], 0) < max_same] if not cands: break prev = today[-1][0] if today else None def score(s): days_left = max(1, (s["exam"] - day).days) need = (s["target"] - s["planned"]) / days_left # matières encore sous la cible d'abord, puis alternance (éviter de répéter la matière précédente) return (s["planned"] < s["target"], s["subject"] != prev, need, s["priority"], -s["exam"].toordinal()) s = max(cands, key=score) left = (s["exam"] - day).days kind = "Questions pratiques" if left <= 7 else ("Apprendre + rappel" if s["planned"] < s["target"] * 0.6 else "Révision mixte") today.append((s["subject"], kind)); used[s["subject"]] = used.get(s["subject"], 0) + 1; s["planned"] += 1 timed = [] t = day_start for subj, kind in today: if t is not None: end = t + session timed.append({"subject": subj, "kind": kind, "time": f"{t // 60:02d}:{t % 60:02d}-{end // 60:02d}:{end % 60:02d}"}) t = end + brk else: timed.append({"subject": subj, "kind": kind}) timetable.append({"date": day.isoformat(), "dow": DAYS[day.weekday()], "exams": exam_days.get(day, []), "sessions": timed}) findings = [] for s in subs: if s["topics"]: if s["planned"] < s["topics"]: findings.append(("HIGH", "UNDER_COVERED", f"{s['subject']} : {s['planned']} sessions pour {s['topics']} sujets ; ajoutez des heures, abandonnez les sujets à faible rendement ou commencez plus tôt")) elif s["planned"] < 1.5 * s["topics"]: findings.append(("MEDIUM", "TIGHT", f"{s['subject']} : {s['planned']} sessions pour {s['topics']} sujets laisse peu de temps pour un deuxième passage")) if s["planned"] < 0.6 * s["target"]: findings.append(("MEDIUM", "BELOW_TARGET", f"{s['subject']} : {s['planned']} des {s['target']} sessions cibles tiennent avant l'examen")) dates = sorted(exam_days) for a, b in zip(dates, dates[1:]): if (b - a).days <= 1: findings.append(("MEDIUM", "BACK_TO_BACK", f"examens le {a} ({', '.join(exam_days[a])}) et le {b} ({', '.join(exam_days[b])}) ; terminez la pratique de la deuxième matière avant le premier examen")) for day, subjects in exam_days.items(): if len(subjects) > 1: findings.append(("MEDIUM", "SAME_DAY", f"{len(subjects)} examens le {day} : {', '.join(subjects)}")) if rest_day is None and len(days) > 10 and not off: findings.append(("LOW", "NO_REST_DAY", "pas de jour de repos dans un plan de plus de 10 jours ; prenez au moins une demi-journée de congé chaque semaine")) if max(weekday_hours, weekend_hours) > 8: findings.append(("LOW", "LONG_DAYS", "plus de 8 heures de révision par jour reste rarement productif ; gardez 5-6 heures concentrées")) findings.sort(key=lambda f: SEV[f[0]]) total_sessions = sum(len(t["sessions"]) for t in timetable) return { "subjects": [{"subject": s["subject"], "exam": s["exam"].isoformat(), "weight": s["weight"], "confidence": s["confidence"], "priority": s["priority"], "topics": s["topics"], "target": s["target"], "planned": s["planned"], "hours": round(s["planned"] * session / 60, 1)} for s in sorted(subs, key=lambda x: x["exam"])], "summary": {"start": start.isoformat(), "last_exam": last.isoformat(), "days": len(days), "sessions": total_sessions, "study_hours": round(total_sessions * session / 60, 1), "session_min": session, "break_min": brk}, "timetable": timetable, "findings": [{"severity": a, "code": b, "message": c} for a, b, c in findings], } def to_markdown(p): s = p["summary"] out = ["# Emploi du temps de révision", "", f"{s['start']} au {s['last_exam']} : {s['days']} jours, {s['sessions']} sessions de {s['session_min']} min ({s['study_hours']} h d'étude concentrée), pauses de {s['break_min']} min", "", "| Matière | Examen | Pondération | Confiance | Priorité | Sujets | Cible | Planifié | Heures |", "|---|---|---|---|---|---|---|---|---|"] for x in p["subjects"]: out.append(f"| {x['subject']} | {x['exam']} | {x['weight']:g} | {x['confidence']} | {x['priority']:g} | {x['topics'] or '-'} | {x['target']} | {x['planned']} | {x['hours']} |") out += ["", "## Jour par jour", ""] for t in p["timetable"]: head = f"- **{t['dow']} {t['date']}**" + (f" (EXAMEN : {', '.join(t['exams'])})" if t["exams"] else "") if not t["sessions"]: out.append(head + " : repos") continue parts = [(f"{x['time']} " if "time" in x else "") + f"{x['subject']} ({x['kind']})" for x in t["sessions"]] out.append(head + " : " + "; ".join(parts)) out += ["", "## Constatations"] out += [f"- {f['severity']} {f['code']} : {f['message']}" for f in p["findings"]] or ["- aucune"] out += ["", "Commencez chaque session par 5 minutes de rappel de mémoire sur la session précédente de cette matière, et terminez par 3 questions auxquelles vous ne pouviez pas répondre."] return "\n".join(out) def self_test(): res = [] def check(name, cond): res.append(cond) print(("PASS " if cond else "FAIL ") + name) D = dt.date S = lambda name, exam, w=1, c=3, t=None: {"subject": name, "exam": exam, "weight": w, "confidence": c, "topics": t} check("slots : 3 h de 50+10 = 3", slots_for(3, 50, 10) == 3) check("slots : 50 min tient exactement 1", slots_for(50 / 60, 50, 10) == 1) check("slots : sous une session = 0", slots_for(0.5, 50, 10) == 0) check("slots : 25+5 dans 2 h = 4", slots_for(2, 25, 5) == 4) p = plan([S("A", D(2026, 1, 8))], D(2026, 1, 5), weekday_hours=2, weekend_hours=2, session=50, brk=10) check("pas de sessions le jour de l'examen ou après", all(t["date"] < "2026-01-08" for t in p["timetable"])) check("la veille de l'examen commence par une épreuve antérieure", p["timetable"][-1]["sessions"][0]["kind"] == "Épreuve antérieure (chronométrée)") check("questions pratiques dans les 7 derniers jours", all(x["kind"] != "Apprendre + rappel" for t in p["timetable"] for x in t["sessions"])) subs = [S("Faible", D(2026, 3, 1), w=3, c=1), S("Fort", D(2026, 3, 1), w=3, c=5)] p = plan(subs, D(2026, 2, 1), weekday_hours=3, weekend_hours=3, max_same=3) pl = {x["subject"]: x["planned"] for x in p["subjects"]} check("la matière faible obtient plus de sessions", pl["Faible"] > 3 * pl["Fort"]) check("priorité = pondération x (6 - confiance)", p["subjects"][0]["priority"] in (15, 3)) p = plan([S("A", D(2026, 3, 1)), S("B", D(2026, 3, 1))], D(2026, 2, 1), weekday_hours=3, weekend_hours=3) check("max 2 sessions d'une matière par jour", all( sum(1 for x in t["sessions"] if x["subject"] == subj) <= 2 for t in p["timetable"] for subj in "AB")) check("matières alternées pendant que les deux ont besoin de temps", all(t["sessions"][i]["subject"] != t["sessions"][i + 1]["subject"] for t in p["timetable"][:10] for i in range(len(t["sessions"]) - 1))) p = plan([S("A", D(2026, 2, 16))], D(2026, 2, 2), rest_day=6) check("jour de repos vide", all(not t["sessions"] for t in p["timetable"] if t["dow"] == "Sun")) p = plan([S("A", D(2026, 2, 6))], D(2026, 2, 2), off={D(2026, 2, 3)}) check("jour de congé vide", not [t for t in p["timetable"] if t["date"] == "2026-02-03"][0]["sessions"]) p = plan([S("A", D(2026, 2, 5)), S("B", D(2026, 2, 9))], D(2026, 2, 2), weekday_hours=4) day5 = [t for t in p["timetable"] if t["date"] == "2026-02-05"][0] check("jour d'examen : la moitié des créneaux, autre matière seulement", len(day5["sessions"]) == 2 and all(x["subject"] == "B" for x in day5["sessions"])) p = plan([S("A", D(2026, 2, 5), t=20)], D(2026, 2, 2)) check("UNDER_COVERED ÉLEVÉE", p["findings"][0]["code"] == "UNDER_COVERED") p = plan([S("A", D(2026, 2, 20), t=11)], D(2026, 2, 2), weekday_hours=1, weekend_hours=1, rest_day=6) check("TIGHT", any(f["code"] == "TIGHT" for f in p["findings"])) p = plan([S("A", D(2026, 2, 9)), S("B", D(2026, 2, 10)), S("C", D(2026, 2, 10))], D(2026, 2, 2)) codes = [f["code"] for f in p["findings"]] check("BACK_TO_BACK et SAME_DAY", "BACK_TO_BACK" in codes and "SAME_DAY" in codes) check("NO_REST_DAY", "NO_REST_DAY" in [f["code"] for f in plan([S("A", D(2026, 3, 1))], D(2026, 2, 1))["findings"]]) check("LONG_DAYS", "LONG_DAYS" in [f["code"] for f in plan([S("A", D(2026, 2, 5))], D(2026, 2, 2), weekend_hours=10)["findings"]]) p = plan([S("A", D(2026, 2, 5))], D(2026, 2, 2), day_start=9 * 60) check("heures d'horloge avec --day-start", p["timetable"][0]["sessions"][1]["time"] == "10:00-10:50") subs = read_subjects("subject;exam_date;weight;confidence;topics\nMaths;2026-12-03;4,5;2;9\n") check("CSV point-virgule + virgule décimale", subs[0]["weight"] == 4.5 and subs[0]["topics"] == 9) for bad, why in [("subject,exam_date\nA,2026-01-01\n", "colonnes manquantes"), ("subject,exam_date,weight,confidence\nA,2026-13-01,1,3\n", "mauvaise date"), ("subject,exam_date,weight,confidence\nA,2026-01-01,1,9\n", "confiance hors plage"), ("subject,exam_date,weight,confidence\nA,2026-01-01,x,3\n", "non-nombre")]: try: read_subjects(bad); check("rejette " + why, False) except InputError: check("rejette " + why, True) try: plan([S("A", D(2026, 1, 1))], D(2026, 1, 1)); check("rejette examen pas après le début", False) except InputError: check("rejette examen pas après le début", True) passed = sum(res) print(f"{passed}/{len(res)} réussis") return 0 if passed == len(res) else 1 def main(): ap = argparse.ArgumentParser(description="Planificateur d'emploi du temps de révision pour examens") ap.add_argument("csv", nargs="?", help="CSV des matières") ap.add_argument("--start", help="premier jour de révision AAAA-MM-JJ (défaut aujourd'hui)") ap.add_argument("--weekday-hours", type=float, default=3.0) ap.add_argument("--weekend-hours", type=float, default=5.0) ap.add_argument("--session-min", type=int, default=50, help="durée de session concentrée (défaut 50)") ap.add_argument("--break-min", type=int, default=10, help="pause entre les sessions (défaut 10)") ap.add_argument("--rest-day", choices=DAYS, help="jour de congé hebdomadaire") ap.add_argument("--off", default="", help="dates sans révision séparées par des virgules (AAAA-MM-JJ)") ap.add_argument("--max-same", type=int, default=2, help="max de sessions d'une matière par jour (défaut 2)") ap.add_argument("--day-start", help="heure d'horloge de la première session HH:MM (ajoute les heures à l'emploi du temps)") ap.add_argument("--json", action="store_true") ap.add_argument("--self-test", action="store_true") a = ap.parse_args() if a.self_test: return self_test() if not a.csv: ap.error("donnez un CSV, ou --self-test") try: with open(a.csv, encoding="utf-8-sig") as fh: subs = read_subjects(fh.read()) start = parse_date(a.start, "--start") if a.start else dt.date.today() off = {parse_date(x, "--off") for x in a.off.split(",") if x.strip()} ds = None if a.day_start: try: h, m = map(int, a.day_start.split(":")); assert 0 <= h < 24 and 0 <= m < 60 except Exception: raise InputError("--day-start doit être HH:MM") ds = h * 60 + m p = plan(subs, start, a.weekday_hours, a.weekend_hours, a.session_min, a.break_min, DAYS.index(a.rest_day) if a.rest_day else None, off, a.max_same, ds) except (OSError, InputError) as e: print(f"erreur : {e}", file=sys.stderr) return 2 print(json.dumps(p, indent=2) if a.json else to_markdown(p)) return 1 if any(f["severity"] == "HIGH" for f in p["findings"]) else 0 if __name__ == "__main__": sys.exit(main())

Connectez-vous pour voir le prompt complet

Continuer avec:

En vous connectant, vous acceptez nos Conditions et Confidentialité

Utilisation

Ce prompt est conçu pour être utilisé avec education. Copiez le contenu ci-dessus et collez-le dans votre outil d’IA préféré.

Pour de meilleurs résultats, personnalisez les espaces réservés (indiqués par des crochets ou des majuscules) selon vos besoins.

Références

Catégories :education| prompts.chat| exam-revision| timetable-planner

Discussion