3. Miklavževa knjiga#

3.1. Predloga in rešitve#

Najprej si prenesi predlogo za reševanje, jo ekstrahiraj in odpri v najljubšem IDEju. Kasneje se bodo tukaj pojavile tudi rešitve.

predloga.zip

Če ne maraš predlog, lahko seveda rešuješ tudi samostojno in funkcije testiraš s primeri iz teh navodil.

3.3. Implementacija#

Bistvo te naloge je, da vse rešitve napišete v eni sami vrstici. Vse funkcije morajo biti takšne:

def ime_funkcije(argumenti):
    return tule_pise_kar_pac_mora_pisati

Nasvet za reševanje
Najprej lahko rešiš naloge na navaden način, z zankami in ostalimi konstrukti, nato pa jih pretvoriš v “onelinerje”.

Napiši naslednje funkcije:

3.3.1. oceni#

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).

>>> oceni(["pretep s sestro", "kuhanje kosila"])
2

3.3.2. povzetek_knjige#

povzetek_knjige(stran) dobi del knjige (ali celo knjigo) in vrne slovar, katerega ključi so imena otrok in vrednosti njihove ocene. Tako mora povzetek_knjige(knjiga), pri čemer je knjiga zgornji slovar, vrniti {'Franc': 20, 'Dani': 5, 'Benjamin': -13, 'Eva': -7, 'Helga': 7, 'Ana': 9, 'Cilka': 0, 'Greta': -1}

>>> povzetek_knjige(knjiga)
{'Franc': 20, 'Dani': 5, 'Benjamin': -13, 'Eva': -7, 'Helga': 7, 'Ana': 9, 'Cilka': 0, 'Greta': -1}

3.3.3. izberi#

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 mora izberi(["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.

>>> izberi(["pometanje stopnic", "pomivanje posode", "kuhanje kosila", "pretep s sestro"],{"zvezek", "lok za violino", "barvice", "bomboni"})
{"zvezek", "barvice", "bomboni"}

3.3.4. strošek#

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 klic strosek(["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.

>>> strosek(["pometanje stopnic", "pomivanje posode", "kuhanje kosila", "pretep s sestro"], {"zvezek", "lok za violino", "barvice", "bomboni"})
15

3.3.5. najpridnejsi_otrok#

najpridnejsi_otrok(knjiga) dobi slovar, katerega imena so ključi otrok in vrednosti seznam njihovih del (tako kot gornji slovar knjiga 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 niz "Franc", saj ima le-ta največ, 20 točk.

>>> najpridnejsi_otrok(knjiga)
"Franc"

3.3.6. poreden#

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 vrne True ali False glede na to, dali je otrok s takimi deli poreden ali ne.

>>> poreden(["prepisana naloga", "pometanje stopnic"])
True

3.3.7. obdarovani#

Miklavž obdaruje le otroke, ki niso poredni. Napiši funkcijo obdarovani(knjiga), ki prejme slovar, kot je gornja knjiga in vrne množico imen otrok, ki niso poredni. Tako mora klic obdarovani(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.

>>> obdarovani(knjiga)
{'Eva', 'Franc', 'Cilka', 'Greta', 'Ana'}