Naloge (ponovitev)

URLji

URL je sestavljen iz imena protokola, naslova strežnika in poti na strežniku. Ime protokola je beseda sestavljena iz črk in števk, ki ji sledi dvopičje (http:, https:, ftp: ali kaj podobnega). Imenu protokola sledita dve poševnici. V naslovu strežnika ni poševnic. Pot se, če ni prazna, začne s poševnico. Celoten URL je torej tak: protokol://strežnik/pot ali protokol://strežnik/ ali protokol://strežnik.

Napiši funkcijo razbijURL(u), ki prejme URL u in kot rezultat vrne ime protokola, naslov strežnika in pot.

print(razbijURL("https://ucilnica.fri.uni-lj.si/course/view.php?id=166"))
('https', 'ucilnica.fri.uni-lj.si', 'course/view.php?id=166')

Rešitev

def razbijURL(u):
    protokol, naslov = u.split("://")
    kosi = naslov.split("/")
    return protokol, kosi[0], "/".join(kosi[1:])

Avtobusi

Napiši funkcijo naslednji_avtobus(prihodi), ki dobi seznam prihodov avtobusov (v številu minut od tega trenutka) in vrne "številko" (npr. "1" ali "6b") avtobusa, ki bo prišel prvi. Če je za več avtobusov napovedan isti čas do prihoda, naj vrne tistega z nižjo številko (a pazite: avtobus 2 ima nižjo številko od avtobusa 11, prav tako ima avtobus 6b nižjo številko od 11). Prihodi avtobusov so podani kot slovar, katerega ključi so "številke" avtobusov ("1", "6b"...), vrednosti pa seznami napovedanih časov do prihoda. Časi niso nujno urejeni po velikosti. Številke avtobusov so naravna števila, ki imajo lahko dodano še eno črko. Primerov, kjer vozi več avtobusov, ki se razlikujejo samo v črki, ne bo.

print(naslednji_avtobus({"1": [5, 7], "2": [11, 3, 18], "6b": [3, 7]}))
2

Rešitev

def naslednji_avtobus(prihodi):
    kdaj = 24*60
    for avtobus, minute in prihodi.items():
        stev = int(avtobus if avtobus[-1].isdigit() else avtobus[:-1])
        minute = min(minute)
        if minute < kdaj or (minute==kdaj and stev<najstev):
            kdaj, najstev, najavtobus = minute, stev, avtobus
    return najavtobus

Seštevke

S števili včasih delamo tole: seštejemo njihove števke, nato seštejemo števke vsote in tako naprej, dokler ne dobimo ene same števke. Vzemimo, recimo, 39. Seštejemo števke in dobimo 3+9=12. Tudi v dvanajst seštejemo vse (torej obe) števki in dobimo 1+2=3. Potem rečemo, da številu 39 pripada števka 3.

Napiši funkcijo sestevke(a, b), ki za vsa števila od a do vključno b izračuna pripadajoče števke ter rezultat vrne v obliki slovarja. Ključi slovarja naj bodo števke, vrednosti pa seznami števil, ki jim pripada ta števka.

print(sestevke(17, 27))
{8: [17, 26], 9: [18, 27], 1: [19], 2: [20], 3: [21], 4: [22], 5: [23], 6: [24], 7: [25]}

Rešitev

def sestevke(a, b):
    stevke = defaultdict(list)
    for i in range(a, b+1):
        v = i
        while v > 9:
            v = sum(int(c) for c in str(v))
        stevke[v].append(i)
    return stevke

Največ dvakrat

Napiši funkcijo najvec_dve(s), ki v podanem seznamu pusti do dve (ne nujno zaporedni) pojavitvi vsakega elementa in pobriše vse nadaljnje. Funkcija mora vrniti None; spreminja naj podani seznam.

Seznam ne vsebuje nujno števil, predpostaviti pa smete, da so njegovi elementi nespremenljivi (immutable).

s = [4, 1, 2, 4, 1, 3, 3, 1, 2, 5, 4, 3, 7, 4]
najvec_dve(s)
print(s)
 [4, 1, 2, 4, 1, 3, 3, 5, 7]

Rešitev

def najvec_dve(s):
    kolikokrat = defaultdict(int)
    i = 0
    while i < len(s):
        e = s[i]
        kolikokrat[e] += 1
        if kolikokrat[e] > 2:
            del s[i]
        else:
            i += 1

Človek ne jezi se

V poenostavljeni igri Človek ne jezi se ima vsak igralec eno figuro. Vsi začnejo na polju 0, igralna plošča pa je neskončno dolga. Igralci se krožno izmenjujejo na potezi. Ko je igralec na vrsti, vrže kocko in premakne figuro za toliko polj, kolikor pokaže kocka. Če pri tem pride na polje, na katerem že stoji kateri drugi igralec, gre tisti (drugi igralec) na polje 0.

Napiši funkcijo clovek_ne_jezi_se(igralcev, meti), ki kot argument dobi število igralcev in zaporedje metov, kot rezultat pa vrne številke polj, na katerih se po teh metih nahajajo igralci.

print(clovek_ne_jezi_se(5, [1, 2, 3, 4, 5, 4, 3, 2, 1, 1, 2, 3]))
[2, 3, 0, 5, 1]

Rešitev

def clovek_ne_jezi_se(igralcev, meti):
    pozicije = [0] * igralcev
    for poteza, met in enumerate(meti):
        igralec = poteza % igralcev
        nova = pozicije[igralec] + met
        pozicije = [0 if x == nova else x for x in pozicije]
        pozicije[igralec] = nova
    return pozicije

Zadnja sprememba: sreda, 21. december 2022, 13.06