Rezultate izpita sem vnesel kar v Učilnico.
Za uspešno opravljen izpit je bilo potrebno doseči 50 točk. Če ima kdo kakšno vprašanje glede točkovanja, naj pove. Končne ocene vpišem čez nekaj dni.
Relativno elegantna rešitev nalog je spodaj.
- Pri prvi nalogi nas v bistvu zanimajo lihi in sodi elementi seznama, ki ga dobimo, če razbijemo niz. S slovarjem pa se pri tej nalogi znebimo
if-ov. (Se spomnite kronogramov s predavanja o slovarjih?) - V drugi se nam splača pripraviti pomožni funkciji, ker jih potrebujemo v kasnejših nalogah. Ali, točneje, ob reševanju kasnejših nalog se nam splača opaziti, da lahko nekaj kode iz druge funkcije izvlečemo v pomožno funkcijo. Mnogi so sicer počeli nekaj podobnega, le brez ločenih funkcij.
- Pri tretji se splača uporabiti
defaultdictinmaxs ključem. Če ga ne, je pač malo daljše. - Pri peti si poglejte predvsem, kako izpeljati učečega se kolesarja. To je zafrkavalo tudi najspretnejše.
# 1
from collections import defaultdict
def razberi_cas(s):
enote = {"d": 24 * 3600, "h": 3600, "m": 60, "s": 1, "ms": 0.001}
s = s.split()
cas = 0
for x, u in zip(s[::2], s[1::2]):
cas += int(x) * enote[u]
return cas
def preberi_case(ime_datoteke):
casi = {}
for vrstica in open(ime_datoteke):
vescina, cas = vrstica.strip().split(": ")
casi[vescina] = razberi_cas(cas)
return casi
# 2
def _cas_vescin(vescine, casi):
cas = 30
for vescina in vescine:
cas += casi[vescina]
return cas
def _trajanje_odseka(x, y, zemljevid, casi):
return _cas_vescin(zemljevid[(x, y)], casi)
def trajanje_poti(pot, zemljevid, casi):
cas = 0
for x, y in zip(pot, pot[1:]):
cas += _trajanje_odseka(x, y, zemljevid, casi)
return cas
# Krajša verzija:
# def trajanje_poti(pot, zemljevid, casi):
# return sum(_trajanje_odseka(x, y, zemljevid, casi) for x, y in zip(pot, pot[1:])
# 3
def najzamudnejsa(pot, zemljevid, casi):
zamude = defaultdict(int)
for x, y in zip(pot, pot[1:]):
for vescina in zemljevid[x, y]:
zamude[vescina] += casi[vescina]
return max(zamude, key=zamude.get)
# 4
def dosegljivo(zacetek, cas, zemljevid, casi):
doseg = {zacetek}
for x, y in zemljevid:
if x == zacetek:
preostali = cas - _trajanje_odseka(x, y, zemljevid, casi)
if preostali >= 0: # Moodle zafrkava: namesto tega gt bi moral biti znak za večje
doseg |= dosegljivo(y, preostali, zemljevid, casi)
return doseg
# 5
class Kolesar:
def __init__(self, casi):
self.casi = casi
def cas(self, vescine):
return _cas_vescin(vescine, self.casi)
def cas_pot(self, pot, zemljevid):
# Tudi to gre krajše, s `sum`. Moramo pa uporabiti `self.cas`,
# sicer imamo težave v podedovanem razredu
cas = 0
for x, y in zip(pot, pot[1:]):
cas += self.cas(zemljevid[x, y])
return cas
class UceciSeKolesar(Kolesar):
def cas(self, vescine):
cas = super().cas(vescine)
for vescina in vescine:
self.casi[vescina] *= 0.9
return cas