Miklavževa knjiga
Testi
Testi: testi-miklavzeva-knjiga.py
Naloga
Miklavž ima knjigo, v katero zapisuje, kaj počnejo otroci. Knjiga je takšne oblike:
Vsako delo prinaša pozitivne ali negativne točke. Točkovalnik je, na primer takšen:
Ko pride ustrezni čas leta, otroci pišejo pisma z željami za darila. Tule so cene daril.
Obvezna naloga
Napiši naslednje funkcije:
-
oceni(dela)
dobi seznam del in vrne njihovo skupno vrednost. Tako mora, na primer,oceni(["pretep s sestro", "kuhanje kosila"])
vrniti 2 (ker dobi -3 točke za pretep in +5 za kosilo). povzetek_knjige(stran)
dobi del knjige (ali celo knjigo) in vrneslovar
, katerega ključi so imena otrok in vrednosti njihove ocene. Tako morapovzetek_knjige(knjiga)
, pri čemer jeknjiga
zgornji slovar, vrniti{'Franc': 20, 'Dani': 5, 'Benjamin': -13, 'Eva': -7, 'Helga': 7, 'Ana': 9, 'Cilka': 0, 'Greta': -1}
izberi(dela, spisek)
dobi seznam otrokovih dejanj in seznam njegovih želja. Vrniti mora množico daril, ki jih bo ta otrok prejel. Otrok prejme le darila, ki si jih želi in katerih cena ne presega števila otrokovih točk. Tako moraizberi(["pometanje stopnic", "pomivanje posode", "kuhanje kosila", "pretep s sestro"], {"zvezek", "lok za violino", "barvice", "bomboni"}) vrniti
{"zvezek", "barvice", "bomboni"}
. Vsota teh del je namreč 8, zato otrok ne bo dobil loka za violino, ki stane 30.- Kot smo videli, dobi otrok VSA darila, ki si jih želi in katerih
posamična cena ne presega števila točk, ki jih je dobil otrok.
Napiši funkcijo
strosek(dela, spisek)
, ki prejme enake argumente kot prejšnja funkcija, kot rezultat pa vrne strošek, ki ga bo Miklavžu naredil ta otrok. Torej bo klicstrosek(["pometanje stopnic", "pomivanje posode", "kuhanje kosila", "pretep s sestro"], {"zvezek", "lok za violino", "barvice", "bomboni"}) vrnil 15: Miklavž bo temu otroku namreč kupil zvezek, barvice in bombone, kar skupaj stane 5 + 7 + 3 = 15. najpridnejsi_otrok(knjiga)
dobi slovar, katerega imena so ključi otrok in vrednosti seznam njihovih del (tako kot gornji slovarknjiga
in vrne ime najpridnejšega otroka. Če je najbolj pridnih več, naj vrne ime poljubnega od njih. Če, na primer, damo funkciji kot argument gornjo knjigo, mora vrniti nizFranc
, saj ima le-ta največ, 20 točk.- Otrok je poreden, če naredi kako delo, ki je kaznovano z vsaj petimi
nagetivnimi točkami. Funkcija
poreden(dela)
naj kot argument prejme seznam del (ne otrok!) in kot rezultat vrneTrue
aliFalse
glede na to, dali je otrok s takimi deli poreden ali ne. - Miklavž obdaruje le otroke, ki niso poredni. Napiši funkcijo
obdarovani(knjiga)
, ki prejme slovar, kot je gornjaknjiga
in vrne množico imen otrok, ki niso poredni. Tako moraobdarovani(knjiga)
vrniti{'Eva', 'Franc', 'Cilka', 'Greta', 'Ana'}
. Ostali otroci so namreč poredni, ker so naredili katero od dejanj, ki se kaznuje s pet ali več negativnimi točkami.
Upoštevaj, da sta točkovalnik del in cena daril fiksni, "knjigo" pa dobi funkcija kot argument in ni nujno vedno enaka.
Rešitve
Dokler se ne hecamo z izpeljanimi seznami, slovarji in množicami, gre samo za vajo iz - no, ja, neizpeljanih seznamov, slovarjev in množic.
Prva funkcija je običajno seštevanje, le da moramo vrednosti, ki jih
seštevamo brati iz slovarja (tockovalnik[delo]
). Podobne reči
počnemo v ostalih. Tudi funkciji najpridnejsi_otrok
in
poreden
tečeta po znanem vzorcu; eden išče maksimalno vrednost
(oz. ime, ki ji pripada), drugi pa (upam, da končno neuspešno!) zavaja v past,
da bi napisali return False
na napačnem mestu.
Dodatna naloga
Vse gornje funkcije napiši v eni vrstici - v tem smislu, kot smo se učili na zadnjih predavanjih.
Če se odločiš reševati dodatno nalogo, ti ni potrebno reševati obvezne, saj je rešitev dodatne očitno hkrati tudi rešitev obvezne.
Rešitev
Tokrat je dodatna naloga preprostejša od obvezne. Vse funkcije so tipičen primer reči, ki jih delamo z generatorji in izpeljanimi rečmi.