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.
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.
Ai nevoie de Python 3.10+. Pentru export în Excel și Word:
pip install openpyxl python-docx pyyamlMarkdown ș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-gimnaziuClaude îl va folosi automat când vorbești despre orar, coliziuni, suplinire sau repartizarea orelor.
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ă.
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"== 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.
python3 $ORAR suplinire --profesor "Popescu Ion" --zile marți,miercuriFă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.
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.
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-v1Problema 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:
- 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.
- Așezarea în orar — în fiecare zi separat, lecțiile se pun pe pozițiile
1..nale 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ă. - Ș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.
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.
- 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.
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.
MIT — folosește-l liber, inclusiv în alte școli, modifică-l și distribuie-l. Singura condiție e păstrarea notei de copyright.