Momente ale problemei orarului
Chiar şi până spre anii 2010, elaborarea şi întreţinerea orarului şcolii era o sarcină manuală dificilă, delegată de obicei vreunui profesor de matematică; dacă-l întărâtai cumva, cel care muncea la orar te apostrofa: "ia fă tu orarul - să vezi şi tu cum vine asta". Prin 1985 a venit şi rândul meu…
Generarea unui orar fără ferestre, sau cu cel mult câte una
Subrutină în limbaj de asamblare pentru obţinerea unui orar fără ferestre, sau a unuia în care profesorii au cel mult câte o singură fereastră. În varianta "cel mult câte o singură fereastră" execuţia este foarte rapidă; în varianta cu zero ferestre - execuţia durează între câteva minute şi una-două ore, în funcţie de calităţile şi defectele schemei iniţiale (şi nu pentru orice schemă dată - de repartizare pe ziua respectivă a claselor la profesori - este posibil un orar fără ferestre).
Structura de memorie adecvată generării unui orar fără ferestre
Avem de pus la dispoziţia unei subrutine în limbaj de asamblare un fişier binar conţinând într-un format unitar cât se poate de compact, datele necesare constituirii orarului pe o zi - rangul profesorului în fişierul text iniţial şi clasele la care trebuie să-i aşezăm orele în acea zi - împreună cu o anumită gamă de octeţi care trebuie astfel gândită încât să ne servească pentru a modela cât mai eficient (folosind direct instrucţiunile microprocesorului) mecanismul bactracking prin care subrutina respectivă să producă un orar fără ferestre.
Actualizarea unui program de elaborare a orarului şcolar
M-am ocupat mult timp (dar acum vreo 20 de ani) de orarul şcolii, folosind un program propriu. Acest program avea două părţi: mai întâi se obţinea o "schemă" de repartizare a orelor pe zilele săptămânii; apoi - după definitivarea manuală a acestei scheme - se obţineau orarele zilnice.
În ultima versiune (prin anul 2002), obţineam schema de repartizare folosind Perl (beneficiind astfel de "expresii regulate" şi de "tablouri asociative"), sub Linux; dar pentru orarele zilnice foloseam Borland C++3.1 şi o subrutină scrisă în Turbo Assembler - sub DOS/Windows, cu I-486. Astăzi îmi dau seama că această manieră neortodoxă de lucru este "culmea" principiului separării lucrurilor.
Determinarea numărului de ferestre dintr-un orar
/
…/
construieşte o expresie regulată (instanţă de obiect javaScript RegExp()
), la fel cum "
…"
construieşte un şir de caractere (instanţă de obiect javaScript String()
). Şablonul /\w[-~]\w/
se potriveşte de exemplu cu "C-1
" (o potrivire = o fereastră), iar /\w[-~]{2}\w/
s-ar potrivi cu "C-~1
" (când o potrivire = două ferestre); modificatorul /…/g
("global") asigură identificarea tuturor potrivirilor (nu numai a primeia), în cadrul şirului respectiv.
vezi Cărţile mele (de programare)