Forum za obvestila

Rezultati pisnega izpita

Rezultati pisnega izpita

by Janez Demšar -
Number of replies: 0

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 defaultdict in max s 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