momente şi schiţe de informatică şi matematică
To attain knowledge, write. To attain wisdom, rewrite.

Colorarea pe profesori a disciplinelor - Bis

R
2026 oct

Se întâmplă că în [1], taman în final, am greșit… Greșim adesea, dar de data aceasta n-am observat la timp și revenim acum, chiar dacă în cazul de față greșala este mai degrabă stupidă, decât interesantă. Cică, după [1]:

> orar_prof(9)  # Orarul profesorului "Mt9"
       Lu  Ma  Mi  Jo  Vi
    1 11A 11A 11A 11A 10C
    2 10C 10C 10C   -   -
    3   -   -   -   -   -
    4   -   -   -   -   -
    5   -   -   -   -   -
    6   -   -   -   -   -
    7   -   -   -   -   -

Dacă ne uităm în setul Mt al tuturor lecțiilor de "Mate", constatăm că în orarul original alocările pe zile și ore pentru clasele 11A și 10C diferă de cele arătate mai sus:

> Mt %>% filter(cls %in% names(P[P==9]))
    1 10C   Lu        5
    2 10C   Ma        3
    3 10C   Mi        6
    4 10C   Vi        2
    5 11A   Lu        2
    6 11A   Ma        1
    7 11A   Mi        1
    8 11A   Jo        4

Zilele s-au păstrat, dar prin funcția orar_prof() orele au fost mutate cumva spre începutul zilelor (iar orarele afișate astfel pentru cei 9 profesori "Mt" au ajuns să fie lipsite complet de ferestre)…
Ziceam în [1]: "Putem adapta orarul_clasei() pentru a formula orarul unui profesor de Mt", iar "adaptarea" făcută păstra secvența:

            row <- S %>% arrange(ora) %>% pull(cls)
            c(row, rep("-", 7-length(row)))

unde S era subsetul lecțiilor de "Mate" dintr-o aceeași zi.
Însă între "actualul" S și cel din orarul_clasei() este o deosebire majoră: pentru clase, câmpul S$ora conține secvența 1:n, unde n este numărul de ore ale clasei din ziua respectivă (iar secvența reprodusă mai sus este corectă); însă pentru "Mt", S$ora indică doar orele profesorului din ziua respectivă (care nu încep neapărat de la prima oră și pot avea ferestre) — de exemplu pentru cazul "Mt9" redat mai sus, pentru ziua Lu în S$ora avem doar valorile 5 și 2, încât prin secvența redată mai sus în "row" se obține (greșit) "11A 10C - - - - -" (înloc de "- 11A - - 10C - -"), fiindcă pull(cls) extrage valorile S$cls fără a ține seama de poziția după câmpul "ora" a acestora.

Rescriem orar_prof(), corijând acum secvența amintită mai sus:

orar_prof <- function(Color) 
    Mt %>% filter(cls %in% names(P[P == Color])) %>% 
        split(.$zl) %>%
        lapply(., function(S) {
            row <- rep('-', 7)  # șablonul orelor zilei
            row[S$ora] <- S$cls  # înscrie clasa conform orei
            row
        }) %>% as.data.frame()

Redăm orarele corectate față de [1]:

or_mt <- lapply(1:9, function(j) orar_prof(j)) %>% 
         setNames(names(pr_mt))
> or_mt[["Mt1"]]
       Lu  Ma  Mi  Jo  Vi
    1 12B 12B  5A 12B 12B
    2  5A   - 12B  5D 12A
    3  5D  5A  5D   -   -
    4 12A  5D 12A   -  5A
    5   - 12A 12A   -   -
    6   -   -   -   -   -
    7   -   -   -   -   -
> or_mt[["Mt9"]]
       Lu  Ma  Mi  Jo  Vi
    1   - 11A 11A   -   -
    2 11A   -   -   - 10C
    3   - 10C   -   -   -
    4   -   -   - 11A   -
    5 10C   -   -   -   -
    6   -   - 10C   -   -
    7   -   -   -   -   -
> or_mt[["Mt4"]]
       Lu  Ma  Mi Jo  Vi
    1  8C 12E 12E 6D  8C
    2 12E  8C  9A  -  6D
    3  9A  9A  8C  -  6E
    4  6E   -   - 6E  8C
    5   -   -  6D 9A 12E
    6  6D   -  6E  -   -
    7   -   -   -  -   -

În [1], fiindcă obțineam (greșit) orare compacte (fără ferestre), trăgeam concluzia că graful G (care ne condusese printr-un algoritm de colorare a vârfurilor, la cei 9 profesori "Mt") are numărul cromatic 9; acum vedem că de fapt, orarele respective nu sunt compacte, încât devine clar că pot fi mai puțin de 9 profesori de "Mate", probabil 8 sau chiar numai 7 (în "Orarul general clase" pe care l-am considerat în [1] sunt maximum 7 clase care fac simultan, într-o aceeași zi și oră, "Mate" — deci numărul cromatic al grafului G este cel puțin 7).

vezi Cărţile mele (de programare)

docerpro | Prev |