Stara domača naloga (2023): Miklavževa pisma
Ta naloga se ocenjuje in vam ne sme manjkati. Da lahko pristopite k izpitu, jo morate rešiti najmanj za oceno 6.
Prišel je čas, da pomagamo Miklavžu.
Nalogi so priloženi podatki. Programiraj tako, da se bodo nahajali v podimeniku "podatki" imenika, v katerem je tvoj program. Če je tvoj program v imeniku /Users/benjamin/programiranje/naloga, morajo biti podatki v /Users/benjamin/programiranje/naloga/podatki. (Pisma, recimo, bodo v /Users/benjamin/programiranje/naloga/podatki/pisma).
Pri reševanju ne smeš predpostaviti, kako je ime otrokom, ponudnikom, darilom. Z drugimi besedami, v tvojem programu se ne sme pojaviti nobeno ime otroka, nobeno ime ponudnika, nobeno konkretno darilo. Program mora biti uporaben tudi prihodnje leto, ko bo Miklavž obdaroval druge otroke z drugimi darili drugih dobaviteljev.
Za oceno 6
V delu za oceno 6 bomo pripravili funkcije, s katerimi bomo kasneje lahko razbirali sopomenke (oziroma, predvsem različne oblike besed), ki pomenijo isto darilo.
sopomenke_besede(s)
prejme niz s z različnimi oblikami neke besede. Oblike so ločene s presledki, "osnovna" beseda je označena z zvezdico. Funkcija mora vrniti par (terko), ki vsebuje "osnovno besedo" in množico vseh besed (vključno z osnovno). Klicsopomenke_besede("sladkarije bombončki *bomboni liziko")
vrne("bomboni", {"sladkarije", "bombončki", "bomboni", "liziko"})
.preberi_sopomenke()
prebere "sopomenke" iz datoteke podatki/sopomenke.txt. Vrniti mora slovar, katerega ključi so vse besede, ki se pojavijo v datoteki, pripadajoče vrednosti pa "osnovne oblike" te besede. Če bi bila datoteka videti takosladkarije bombončki *bomboni *zemljevid *vlak *vlakec
bi funkcija vrnila
{"sladkarije": "bomboni", "bombončki": "bomboni", "bomboni": "bomboni", "zemljevid": "zemljevid", "vlak": "vlak", "vlakec": "vlak"}
Ko napišeš drugo funkcijo, dodaj v program vrstico
sopomenke = preberi_sopomenke()
(postavi jo pod to funkcijo in na začetek vrstice). Slovar sopomenk se nikoli ne spreminja, torej ni nič narobe, če si poenostavimo delo tako, da ga uporabljamo kar kot globalno spremenljivko.Napiši funkcijo
prevod_besede(beseda)
, ki prejme besedo in vrne njeno "osnovno obliko". Če besede ni v slovarju sopomenk, pa naj funkcija vrneNone
. Klicprevod_besede("vlakec")
vrne"vlak"
. Klicprevod_besede("vlak")
prav tako vrne"vlak"
. Klicprevod_besede("avtobus")
vrneNone
, ker te besede ni v slovarju.V funkciji lahko uporabiš spremenljivko
sopomenke
(da ne boš stalno klical branja sopomenk).
Za oceno 7
V nalogah za oceno 7 bomo brali pisma Miklavžu. Nahajajo se v imeniku podatki/pisma in so videti, na primer, tako
Dragi Miklavž,
Pozdravljen! Kako kaj? Jaz sem v redu. Letos sem bila pridna (vsaj večino časa).
Prosim, prosim, prinesi mi kakšno knjigo, ki jo lahko prebiram pred spanjem. In
če lahko, dodaj še mehkega plišastega medvedka, da bova lahko skupaj brala.
Obljubljam, da bom vedno pospravljala svojo sobo.
Lepo se imej,
Ema
Opomba: večino pisem mi je prijazno sestavil chatGPT. :))))
poenostavi_besedilo(s)
prejme niz. Vrniti mora niz, ki je enak podanemu, vendar vsebuje le črke, presledke in znake za novo vrstico. Poleg tega spremeni vse črke v male črke. Klicpoenostavi_besedilo("Dragi Miklavž,\n\npišem ti (kot vsako leto): lep božič!")
vrne"dragi miklavž\n\npišem ti kot vsako leto lep božič"
.izlusci_avtorja(ime_dat)
prejme ime datoteke s pismom in vrne ime njenega avtorja. Ime je tisto, kar je zapisano v zadnji neprazni vrstici. Avtor gornjega pisma je očitno Ema.izlusci_darila(ime_dat)
vrne množico vseh daril, omenjenih v pismu v datoteki s podanim imenom. Beseda predstavlja darilo, če je enaka kateri od besed, ki se pojavijo med sopomenkami; v vrnjeni množici mora biti osnovna oblika besede. Za gornje pismo vrne{"knjiga", "medvedek"}
Pazi: če se v besedilu pojavi beseda "navlaka" ali pa otrok piše, kako je videti "gozdna vlaka", to še ne pomeni, da bi rad vlak! Ne išči delov besed!
Program bo seveda nenatančen: če otrok napiše "lani si mi prinesel piškote", jih bo pač dobil tudi letos; če napiše "na kolesu vedno nosim čelado", utegne dobiti kolo in čelado.
darila_po_otrocih()
ne prejme nobenih argumentov. Vrniti mora slovar, katerega ključi so avtorji pisem, pripadajoče vrednosti pa darila, ki so v pismu omenjena. Vrnjeni slovar se začne tako:{'Albert': {'žoga'}, 'Ana': {'knjiga', 'pisalo', 'zvezek'}, 'Benjamin': {'čelada', 'kolo'}, 'Berta': {'čokolada', 'piškoti'}, 'Cilka': {'barvice', 'bomboni'}, 'Dani': {'kocke', 'bomboni'}, 'Daniela': {'knjiga', 'blazina', 'medvedek'}, 'Dudley': {'vlak', 'zvezek', 'pero', 'čokolada', 'bomboni', 'žoga', 'knjiga', 'kolo'}, ...
zbirnik_daril()
ne prejme nobenih argumentov. Vrniti mora slovar, katerega ključi so darila, vrednosti pa število "naročenih" kosov tega darila. Tako ključu"barvice"
pripada vrednost7
, saj si barvice želi 7 otrok.
Ocena 8
Miklavž nabavlja darila pri dolgoletnih dobaviteljih: Godler s.p., Klemenčič s.p., Lampič s.p., Pavlič s.p. in Dežman s.p. Njihovi ceniki so v podatki/dobavitelji. V kakšni obliki so, si oglej sam.
preberi_cenik(ime_ponudnika)
prejme ime ponudnika, na primer "Lampic" (brez šumnikov, da ni komedij na MS Windows). Vrniti mora slovar, katerega ključi so vse, kar ponuja podani s.p., pripadajoče vrednosti pa cene. Klicpreberi_cenik("Lampic")
vrne{'avtomobilček': 15.0, 'barvice': 9.0, 'bomboni': 3.0, 'knjiga': 12.0, 'medvedek': 15.0, ... in tako naprej
ceniki()
vrne slovar, katerega ključi so imena ponudnikov, vrednosti pa slovarji z njihovimi ceniki (torej tem, kar vrača prejšnja funkcija.) Za primer poglej kar v teste, funkcijatest_ceniki
.najcenejsi_ponudnik(ceniki, darilo)
prejme cenike v enaki obliki, kot jih vrača prejšnja funkcija in ime darila. Vrniti mora par (terko) z imenom najcenejšega podudnika in ceno. (Pravni oddelek inštitucije svetega Miklavža ima še bolj preplašene pravnike kot UL in fakultete; ker je sv. Miklavž javna oseba, jih skrbi, da morda sodi pod javno upravo in mora vedno nabavljati pri najcenejšem ponudniku, ne glede na (ne)kvaliteto.)V primeru, da ima najcenejšo ponudbo več ponudnikov, mora vrniti tistega, ki je kasneje po abecedi.
Klic
najcenejsi_ponudnik(ponudbe, "žoga")
vrne("Dezman", 20)
: žoge so najcenejše pri Dežmanu in sicer stanejo 20.Klic
najcenejsi_ponudnik(ponudbe, "medvedek")
vrne("Pavlic", 15)
. Medvedki po enaki ceni, 15, se dobijo tudi drugod, vendar je Pavlič zadnji po abecedi.ponudniki_in_cene(ceniki, darila)
je podobna prejšnji funkciji, le da prejme množico daril. Vrniti mora slovar, katerega ključi so podana darila, vrednosti pa pari, kakršne vrača prejšnja funkcija.Klic
ponudniki_in_cene(ponudbe, {"medvedek", "kolo", "glina", "žoga"})
vrne{'glina': ('Godler', 3.0), 'kolo': ('Pavlic', 210.0), 'medvedek': ('Pavlic', 15.0), 'žoga': ('Dezman', 20.0)}
Ta funkcija nam torej pove, kje bo Miklavž dobil našteta darila in po koliko.
Ocena 9
vrednost_daril(otrok)
vrne skupno vrednost daril, ki si jih želi otrok ob predpostavki, da bomo vsako od njih kupili pri najcenejšem ponudniku. Predpostaviti smeš, da je otrokovo pismo v datoteki podatki/pisma/{otrok}.txt.preberi_tockovalnik()
prebere datoteko, v kateri Miklavž vodi evidenco o tem, kateri otrok je bil priden in poreden. Vsaka vrstica vsebuje ime otroka, ki mu sledi dvopičje. Sledijo pozitivne točke za dobra in negativna za slaba dela. Funkcija mora vrniti slovar, katerega ključi so imena otrok, ki se pojavijo v točkovalniku, pripadajoče vrednosti pa vsota njihovih točk.dolocitev_daril(proracun, darila, ponudniki_cene)
prejme skupno ceno daril, ki jih lahko dobi nek otrok, množico daril, ki si jih želi, in slovar, kakršnega vrne funkcijaponudniki_in_cene
. Funkcija vrne množico daril, ki jih bo ta otrok dejansko dobil. Določi jih na naslednji način.- Uredi darila od dražjih proti cenejšim, enako draga darila uredi padajoče po abecedi.
- Za vsako darilo po vrsti pogleda, ali je njegova cena manjša od preostalega zneska, ki ga je na voljo. Če je, doda darilo med darila, ki jih bo prejel in ustrezno zmanjša znesek. Če je darilo dražje od preostale količina denarja, pa ga preskoči.
- Nato nadaljuje z naslednjim darilom...
Pomoč: če Pythonu damo urediti seznam terk, recimo parov, jih bo uredil po prvem elementu, tiste, pri katerih je prvi element enak, pa po drugem. Če hočemo nek seznam urediti padajoče, podamo funkciji za urejanje dodatni argument
reverse=True
darila_za_otroka(otrok, tockovalnik, otroci_darila, ponudniki_cene)
prejme ime otroka, točkovalnik (kot ga vrača funkcijapreberi_tockovalnik
), slovar, kot ga vračadarila_po_otrociih
in slovar, kot ga vračaponudniki_in_cene
. Vrniti mora množico daril, ki jih bo dobil otrok glede na to, katera darila si želi in koliko denarja mu je Miklavž pripravljen nameniti.Skupna vrednost daril, ki jih bo dobil otrok, ne more preseči števila točk, deljenega z 10. Katera darila bo dobil, je določeno v opisu prejšnje funkcije.
Ocena 10
Napiši funkcijo narocila()
, ki sestavi naročila za dobavitelje: funkcija mora sestaviti datoteke z imeni Dezman.txt, Godler.txt in tako naprej z vsebino v naslednji obliki:
Spoštovani dobavitelj,
pri vas bi rad naročil naslednja darila:
kosov
barvice..................6
blazina..................2
kocke....................2
Lep pozdrav,
Sveti Miklavž
Konkretna vsebina je za vsakega dobavitelja seveda drugačna. Datoteka mora biti oblikovana do pike in presledka tako, kot kaže vzorec. Predmeti naj bodo urejeni po abecedi. Datoteke naj bodo shranjene v trenutnem direktoriju (torej tam, kjer je program).
Funkcija mora prej seveda ugotoviti, katera darila dobi kateri otrok in pri kom bodo nabavljena.
Test in podatki
- 26. november 2023, 10:43