Pobude meščanov
MOL vzdržuje spletno stran Pobude meščanov. Z namenom zagotavljanja čim resnejših odgovorov na pobude pešcev kolesarjev, je Oddelek za gozdarske dejavnosti in motorni promet vzpostavil hierarhijo in postopek odgovarjanja, ki je takšen:
- Vsako prejeto pobudo zabeležijo in jo dodelijo v obravnavo naključno izbrani osebi iz Oddelka.
Oseba pobudo temeljito preuči in nato:
- prepusti pobudo v obravnavo kateremu izmed podrejenih (če jih ima). Ista oseba je lahko podrejena večim osebam!
Druga možnost je, da na pobudo odgovori sama, tako da naključno izbere enega izmed naslednjih štirih odgovorov:
- Hvala za komentar.
- Predlagana sprememba ni v načrtu.
- Ureditev bomo reševali celostno.
- Problem bomo preučili in ukrepali skladno s pristojnostmi.
Severnokorejski hekerji so nedavno vdrli v prostore Oddelka in jim odtujili dragoceni USB ključek z zapiski delovanja Oddelka ter javno objavili njegovo vsebino. Vsaka vrstica vsebuje
- čas, ko se je s pobudo nekaj zgodilo. Zapisan je s številom dni od vzpostavitve spletne strani,
- številko pobude,
- oznako, da je pobuda prejeta ali pa ime osebe, ki je v zvezi s pobudo na ta dan izvedla bodisi akcijo "odgovori"
bodisi akcijo "prepusti"
.
- Akciji sledi dvopičje in nato bodisi odgovor bodisi ime osebe, ki ji je bila pobuda prepuščena.
...
[709] Pobuda 108: Angelca prepusti: Cilka
[710] Pobuda 124: prejem
[711] Pobuda 110: Zofka prepusti: Johanca
[715] Pobuda 125: prejem
[718] Pobuda 101: Fanči odgovori: Hvala za komentar.
[720] Pobuda 115: Zofka prepusti: Johanca
[720] Pobuda 126: prejem
[724] Pobuda 99: Johanca prepusti: Ema
...
Datoteka je urejena kronološko, po naraščajočih časih.
Točno obliko si oglejte v priloženi datoteki.
Ocena 6
Napiši naslednje funkcije.
preberi_zapis(s)
prejme vrstico, kakršne vidite v datoteki, in vrne terko s petimi elementi(cas, stevilka, akcija, kdo, rezultat)
.cas
instevilka
sta števili (int
)akcija
je"prejem"
,"odgovori"
ali"prepusti"
kdo
je ime osebe, ki je pobudo obravnavala in jo na ta dan prepustila drugemu ali pa odgovorila nanjo; v primeru, da je akcija"prejem"
, jekdo
enakNone
rezultat
je ime osebe, ki ji je bila pobuda prepuščena (če jeakcija
enaka"prepusti"
), odgovor (če je akcija"odgovori"
) aliNone
(če je akcija"prejem"
).
Primeri:
preberi_zapis("[720] Pobuda 126: prejem")
vrne(720, 126, "prejem", None, None)
.preberi_zapis("[725] Pobuda 86: Ema odgovori: Ureditev bomo reševali celostno.")
vrne(725, 86, "odgovori", "Ema", "Ureditev bomo reševali celostno.")
.preberi_zapis("[727] Pobuda 114: Zofka prepusti: Johanca")
vrne(727, 114, "prepusti", "Zofka", "Johanca")
.
preberi_dnevnik(ime_datoteke)
prejme ime datoteke in vrne seznam terk, kot jih vrne funkcijapreberi_zapis
. Terke predstavljajo vse vrstice v datoteki v enakem vrstnem redu, kot so v datoteki.strni(zapisi)
prejme seznam terk, kot jih vrne funkcijapreberi_dnevnik
, in vrne seznam, kateregai
-ti element vsebuje seznam z vsemi terkami, ki se nanašajo nai
-to pobudo. Terke morajo biti tem iz prejšnjih dveh funkcij, le brez številke pobude. Elementi seznama morajo biti urejeni po naraščajočem času.Ker pobuda s številko 0 ne obstaja, je prvi element seznama enak
None
. Predpostaviti smeš, da se vse druge številke pobud (do zadnje) pojavijo. Ne smeš pa vnaprej predpostaviti števila pobudb v datoteki.Če pokličemo
strnjeni = strni(preberi_dnevnik("dnevnik.txt"))
, jestrni[101]
enak[(554, 'prejem', None, None), (638, 'prepusti', 'Angelca', 'Fanči'), (718, 'odgovori', 'Fanči', 'Hvala za komentar.')]
saj je bila pobuda 101 preprosta in je njena obravnava zahtevala le dve osebi (in slabe pol leta).
casi(zapisi)
prejme seznam terk, kot jih vrne funkcijapreberi_dnevnik
, in vrne slovar, katerega ključi so številke pobud, vrednosti pa čas (v dnevih), ki je minil od prejema pobude do odgovora nanjo.
Ocena 7
hitro(zapisi, meja)
vrne število pobud, katerih obravnava je trajala največmeja
dni.najtezji_primer(zapisi)
vrne številko pobude, ki je bila obravnavana najdlje. Če je takšnih več, vrne poljubno med njimi.podrejeni(zapisi)
vrne slovar, katerega ključi so imena vse oseb, ki imajo vsaj enega podrejenega, vrednosti pa množice podrejenih. Da je neka oseba podrejena drugi, sklepamo po tem, da je od nje vsaj enkrat dobila v obravnavo neko pobudo.Naj vas ne začudi: Oddelek za gozdarske dejavnosti in motorni promet je sofisticiran, zato ima lahko vsaka oseba več nadrejenih. Nikoli pa ne pride do kroga, ko bi bila neka oseba (posredno) podrejena sama sebi.
Ocena 8
razmerje(zapisi)
vrne slovar, katerega ključi so imena vseh oseb, vrednosti pa delež ponudb, ki jih je ta oseba obravnavala in nanje odgovorila sama. Če bi Cilka odgovorila na 7 pobud, 13 pa prepustila drugim, bi bil njen delež 0.35 (7 / 20).natancnost(zapisi)
vrne slovar, katerega ključi so imena oseb, vrednosti pa povprečni čas, ki ga je oseba porabila od prejema pobude do odgovora oz. prepustitve podrejenemu.Za pobudo 101 obstajajo naslednji zapisi:
[554] Pobuda 101: prejem [638] Pobuda 101: Angelca prepusti: Fanči [718] Pobuda 101: Fanči odgovori: Hvala za komentar.
To pomeni, da jo je Angelca obravnavala 638 - 554 = 84 dni, Fanči pa 718 - 638 = 80 dni.
kvaliteta(zapisi)
vrne seznam oseb, urejen glede povprečni čas, ki ga porabijo za obravnavo, začenši s tistimi, ki so najvestnejši in za obravnavo porabijo največ. Če ima več oseb enak čas, naj bodo urejene po abecedi.
Ocena 9
neustvarjalni(zapisi)
: notranja revizija je pokazala, da nekateri svojega dela ne jemljejo resno in na vse pobude odgovorijo enako, namesto da bi izžrebali naključni odgovor. Funkcijaneustvarjalni
naj vrne slovar, katerega ključi so imena teh lenuhov, vrednosti pa njihov (edini) odgovor na pobude.pot_med(hierarhija, oseba1, oseba2)
: prejme slovar, kot ga vračapodrejeni
in imeni dveh oseb. Če jeoseba2
posredno ali neposredno podrejena osebioseba1
, funkcija vrne seznam oseb na poti odoseba1
dooseba2
. Če ni tako, vrneNone
.Če bi na MOL delala Adamova rodbina, bi klic
pot_med(rodbina, "Adam", "Herman")
vrnil["Adam", "Daniel", "Hans", "Herman"]
.nivoji(hierarhija, oseba)
vrne slovar, katerega ključi so vse osebe, ki so podrejene podani osebi, pripadajoče vrednosti pa število korakov od podane osebe do te osebe. Če je do te osebe možnih več poti, mora ključ predstavljati dolžino najkrajše poti.hierarhija = a: {b, c}, b: {c, d, e}, d: {e}, }
Klic
nivoji(hierarhija, "a")
vrne{"b": 1, "c": 1, "d": 2, "e": 2}
. Oda
doe
obstajata dve potia -> b -> d -> e
ina -> b -> e
. Funkcija vrne 2, ker je to dolžina krajše poti.
Ocena 10
Poglej ustrezne zapiske oz. videe v Božični priboljški.
- Poskrbi, da bo funkcija
preberi_dnevnik
datoteko odprla v blokuwith
. - Za shranjevanje zapisov namesto terk uporabljaj poimenovane terke (
NamedTuple
) s poljicas
,stevilka
,akcija
,kdo
,rezultat
. Ime podatkovnega tipa naj boZapis
. Zadnja dva elementa naj imata privzeto vrednostNone
. (Ker je poimenovana terka še vedno terka, bo dovolj uvesti razred in spremeniti eno samo funkcijo.) Nekatere funkcije, ki prejmejo argument
zapisi
, bi v resnici lahko prejele kar vrača funkcijacasi
. Tvoja funkcijanajtezji_primer
se skoraj gotovo začne zdef najtezji_primer(zapisi): casi_zapisov = casi(zapisi) ... # in potem delaš s casi_zapisov
Pripravi dekorator
s_casi
, ki ti bo omogočil to funkcijo spremeniti v@s_casi def najtezji_primer(casi_zapisov): ... # in potem delaš s casi_zapisov
Testi jo bodo seveda še vedno klicali s seznamom terk, dekorator pa poskrbi, da bo dobila argument v pravi obliki.
Dekorator ustrezno uporabi v funkciji
najtezji_primer
in drugih, kjer je to primerno.Označi tipe argumentov in rezultatov funkcij
hitro
,podrejeni
,pot_med
innivoji
.
Testi
- 23. december 2024, 20:05