Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

orar — orarul lecțiilor pentru gimnaziu

Unealtă pentru construirea orarului școlar pornind de la fișiere text simple, cu verificare automată a coliziunilor, versionare a fiecărei variante și plan de suplinire când un profesor lipsește.

Funcționează atât ca skill pentru Claude Code, cât și ca unealtă de linie de comandă de sine stătătoare.

Ce rezolvă

Un orar școlar are trei feluri de cerințe, iar confundarea lor e sursa majorității greșelilor:

  • Reguli tari — un profesor nu poate fi în două clase deodată, o sală nu poate fi ocupată de două clase, o clasă nu poate avea o oră liberă în mijlocul zilei, numărul de ore din plan trebuie respectat exact.
  • Reguli moi — orarul funcționează și fără ele, dar oamenii îl vor detesta: ferestre între orele profesorilor, matematică la ultima lecție, cinci discipline grele într-o zi.
  • Preferințe locale — cine vine doar în anumite zile, ce cabinet e obligatoriu, ce zi e mai ușoară.

Generatorul le tratează diferit: primele nu se încalcă niciodată, celelalte se minimizează, iar rezultatul e verificat de un modul independent care nu împrumută nimic din generator — ca să prindă și greșelile generatorului, și modificările făcute manual.

Instalare

Ai nevoie de Python 3.10+. Pentru export în Excel și Word:

pip install openpyxl python-docx pyyaml

Markdown și HTML funcționează fără nicio dependență.

Ca unealtă de sine stătătoare — clonează repo-ul și folosește scripts/orar.py.

Ca skill pentru Claude Code — clonează în folderul de skill-uri:

git clone https://github.com/evisoft/orar.git ~/.claude/skills/orar-gimnaziu

Claude îl va folosi automat când vorbești despre orar, coliziuni, suplinire sau repartizarea orelor.

Folosire prin conversație (Claude Code)

Dacă l-ai instalat ca skill, nu trebuie să ții minte nicio comandă. Pui fișierele în folderul proiectului și îi spui lui Claude ce vrei:

„Am pus în date/ fișierul cu clasele și profesorii. Fă-mi orarul."

Claude citește fișierele, îți arată ce a înțeles (câte ore are fiecare clasă, câte ore are fiecare profesor) și așteaptă confirmarea ta înainte de a genera — pasul ăsta prinde cele mai multe greșeli, fiindcă o linie citită greșit trece altfel neobservată până la afișarea orarului.

Alte lucruri pe care le poți cere direct:

Ce spui Ce se întâmplă
„Verifică dacă sunt coliziuni" rulează verificarea independentă și îți rezumă erorile și avertismentele
„Ceban Maria e bolnavă marți și miercuri" îți propune variante de suplinire pentru fiecare lecție rămasă descoperită
„Mută ora de fizică de la VII-A de luni pe joi" face mutarea și verifică imediat ce s-a stricat
„Chimia la IX-A o preia Rotaru Vera" schimbă titularul în cerințe și în orar
„Ce s-a schimbat față de versiunea de la 1 septembrie?" compară cele două versiuni, lecție cu lecție
„Prea multe ferestre la profesori" reglează prioritățile în config.yaml și regenerează
„Dă-mi orarul în Excel și Word" exportează în formatele cerute
„Întoarce-te la versiunea de dinainte" restaurează versiunea salvată

Regula pe care skill-ul o impune: un orar cu erori nu se exportă și nu se afișează ca fiind gata. Dacă o modificare strică ceva, ți se spune exact ce s-a stricat și ai de ales între altă variantă și revenirea la versiunea anterioară.

Folosire din linia de comandă

ORAR=~/.claude/skills/orar-gimnaziu/scripts/orar.py

python3 $ORAR init                      # creează config.yaml, date/, versiuni/
python3 $ORAR pregateste date/*.txt     # citește datele și arată ce a înțeles
python3 $ORAR diagnostic                # caută imposibilități ÎNAINTE de generare
python3 $ORAR genereaza                 # construiește orarul
python3 $ORAR verifica                  # verificare independentă
python3 $ORAR exporta --formate md,html,xlsx,docx
python3 $ORAR versiune salveaza --nume "v1" --nota "orar inițial, septembrie"

Fișierul de intrare

== CLASE ==
V-A
Limba și literatura română | 5 | Ceban Maria
Matematică | 4 | Popescu Ion
Educație fizică | 2 | Balan Victor | sala sport
Educație tehnologică | 1 | Chirica Mihai | atelier

== PROFESORI ==
Cazacu Petru  | doar: marți, joi, vineri
Postica Nina  | indisponibil: luni
Chirica Mihai | indisponibil: vineri după 4
Ursu Diana    | max 6 lecții/zi

Parserul e tolerant: acceptă bară, tab, punct-și-virgulă, liniuță sau virgulă ca separator; ordinea coloanelor nu contează; orele lipsă se completează din planul-cadru (valori orientative, marcate explicit). Antetele de clasă merg în mai multe forme: V-A, VI B, Clasa a VII-a A, [VIII-B].

Detalii complete în references/format-intrare.md.

Când un profesor lipsește

python3 $ORAR suplinire --profesor "Popescu Ion" --zile marți,miercuri

Fără --aplica, comanda doar propune variante pentru fiecare lecție rămasă descoperită, în ordinea în care le-ar cântări un director: coleg de aceeași disciplină liber atunci → o lecție de mai târziu urcă → clasa vine mai târziu sau pleacă mai devreme → supraveghere.

Cu --aplica, se salvează o versiune separată de suplinire; orarul de bază rămâne neatins. Orele neținute apar acolo ca „de recuperat", nu ca erori. Acceptă și date calendaristice: --zile 2026-09-14,2026-09-15.

Modificări punctuale

python3 $ORAR muta --clasa VII-A --de-la luni:3 --la marți:5
python3 $ORAR profesor --clasa IX-A --obiect "Chimie" --nou "Rotaru Vera"

Ambele rulează verificarea imediat după și raportează ce s-a stricat.

Versiuni

Fiecare salvare creează versiuni/AAAA-LL-ZZ-HHMM-nume/ cu orarul, exporturile, raportul de verificare și motivul schimbării. Nimic nu se suprascrie.

python3 $ORAR versiune lista
python3 $ORAR versiune compara --nume 2026-09-01-0900-v1
python3 $ORAR versiune restaureaza --nume 2026-09-01-0900-v1

Cum funcționează generatorul

Problema se rezolvă în trei etape, fiindcă așa devine mult mai ușoară decât căutarea directă într-un spațiu de zeci de clase × 35 de sloturi:

  1. Repartizarea pe zile — în ce zile cade fiecare oră a fiecărui obiect, respectând disponibilitatea profesorilor și plafoanele zilnice. Cerințele cu cel mai puțin loc de manevră se plasează primele.
  2. Așezarea în orar — în fiecare zi separat, lecțiile se pun pe pozițiile 1..n ale fiecărei clase (deci elevii nu au ferestre prin construcție), printr-o căutare cu retur peste măști de biți, cu reîncercări scurte randomizate în loc de o singură căutare exhaustivă.
  3. Șlefuirea — interschimbări care nu strică nicio regulă tare, atât timp cât scade costul: ferestrele profesorilor, obiectele grele la ultima oră, zilele supraîncărcate. Costul se evaluează incremental, doar pe perechile (profesor, zi) și (clasă, zi) atinse de mutare.

Pentru un gimnaziu de 10 clase, 16 profesori și 262 de lecții săptămânale, generarea durează ~2 secunde.

Verificări

Erori (orar invalid): coliziuni de profesor, coliziuni de sală, ferestre în orarul claselor, ore lipsă sau în plus față de plan, profesor programat când e declarat indisponibil, depășirea plafonului zilnic.

Avertismente (orar valid, dar imperfect): ferestre la profesori, obiecte solicitante la ultima oră, zile cu prea multe discipline grele, aceeași disciplină de două ori într-o zi deși ar fi încăput în zile diferite.

Limite cunoscute

  • fără schimbul doi și clase care învață după-amiaza;
  • fără subgrupe cu orare diferite (doar grupe simultane, în același slot);
  • fără deplasarea profesorilor între clădiri;
  • fără orar pe săptămâni pare/impare.

Structură

SKILL.md                   instrucțiunile pentru Claude Code
scripts/orar.py            unealta de linie de comandă
scripts/orarlib/
  parser.py                citirea tolerantă a fișierelor text
  solver.py                generatorul (etapele A, B, C)
  verificare.py            verificarea independentă
  suplinire.py             profesor absent + modificări punctuale
  versiuni.py              versionarea cu foldere datate
  export.py                Markdown, HTML, Excel, Word
  plan_cadru.py            ore orientative (Rep. Moldova)
references/                format de intrare, reguli, depanare
assets/date-exemplu/       set de date fictiv, complet

Valorile din plan_cadru.py sunt orientative pentru Republica Moldova, se schimbă de la an la an și diferă în funcție de orele opționale ale școlii — confirmă-le înainte de a le folosi.

Licență

MIT — folosește-l liber, inclusiv în alte școli, modifică-l și distribuie-l. Singura condiție e păstrarea notei de copyright.

About

Orarul lecțiilor pentru gimnaziu: generare automată, verificare a coliziunilor, versionare și plan de suplinire. Skill pentru Claude Code și unealtă CLI.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages