Podvojeni elementi

Napišite funkcijo podvojeni(xs), ki v seznamu xs ohrani le prvo pojavitev vsakega elementa in vrne nov seznam.

>>> podvojeni([5, 1, 3, 1, 1, 3, 8])
[5, 1, 3, 8]

Rešitev

def podvojeni(xs):
    ys = []
    for x in xs:
        if x not in ys:
            ys.append(x)
    return ys

Če vrstni red elementov ni pomemben, lahko nalogo rešimo tudi tako ...

return list(set(xs))

... če pa je pomemben, potem lahko uporabimo OrderedDict.

from collections import OrderedDict
def podvojeni(xs):
    return list(OrderedDict(zip(xs, xs)).keys())

Eboran

Napišite funkcijo eboran(s), ki prejme niz s oz. stavek (zapisan kot besede, med katerimi so presledki, brez ločil) in vrne nov stavek, v katerem so vse besede obrnjene.

>>> eboran('vse je narobe tudi tale stavek')
'esv ej eboran idut elat kevats'

Rešitev

def eboran(s):
    r = ''
    for beseda in s.split():
        if r: r += ' '
        r += beseda[::-1]
    return r

Še v eni vrstici.

def eboran(s):
    return ' '.join(beseda[::-1] for beseda in s.split())

Kocka

Namesto ene kocke s šestimi stranicami uporabljajo nekatere igre drugačne kocke. Različne možnosti opišemo s standardno notacijo: niz 3d8 recimo pomeni, da trikrat vržeš kocko z osmimi stranicami in sešteješ rezultate posameznih metov. Napišite funkcijo vrzi(kocka), ki sprejme tak niz, simulira ustrezno številov metov kocke z danim številom stranic in vrne rezultat.

>>> vrzi('3d4') # trije meti kocke s štirimi stranicami
10
>>> vrzi('3d4')
7
>>> vrzi('1d20')
16
>>> vrzi('20d1') # rahlo nesmiselna kocka z eno stranico
20

Namig: oglejte si funkcije v modulu random.

Rešitev

def vrzi(kocka):
    metov, strani = kocka.split('d')
    vsota = 0
    for i in range(int(metov)):
        vsota += random.randint(1, int(strani))
    return vsota

Napišite še funkcijo pricakovana_vrednost(kocka, n), ki simulira met dane kocke n-krat in vrne povprečni rezultat.

>>> pricakovana_vrednost('3d4', 1000)
7.523

Rešitev

def pricakovana_vrednost(kocka, n=10000):
    vsota = 0
    for _ in range(n):
        vsota += vrzi(kocka)
    return vsota / n

Dan

Napišite funkcijo dan(d, m, l), ki vrne ime dneva v tednu za podan datum.

>>> dan(1, 10, 2018)
'ponedeljek'

Namig: oglejte si funkcije v modulu calendar.

Rešitev

def dan(d, m, l):
    n = calendar.weekday(l, m, d)
    return ['ponedeljek', 'torek', 'sreda', 'četrtek', 'petek',  'sobota', 'nedelja'][n]

Največja datoteka

Napišite funkcijo najvecja(pot), ki vrne ime največje datoteke v imeniku pot.

>>> najvecja('c:/Users/me/Downloads')
'elephants-dream.mp4'

Za to funkcijo ni testnih primerov. Namig: oglejte si funkcije v modulih os in os.path.

Rešitev

def najvecja(pot):
    naj_velikost = 0
    naj_datoteka = None
    for ime in os.listdir(pot):
        datoteka = os.path.join(pot, ime)
        if not os.path.isfile(datoteka):
            continue
        velikost = os.path.getsize(datoteka)
        if velikost >= naj_velikost:
            naj_velikost = velikost
            naj_ime = ime
    return naj_ime

An ban pet podgan

Napišite funkcijo an_ban_pet_podgan(xs), ki za seznam xs poišče zmagovalca v izštevanki "An ban pet podgan". Zmagovalec igre je tisti, ki na koncu edini ostane neizločen.

>>> an_ban_pet_podgan(["Maja", "Janja", "Sabina", "Ina", "Jasna"])
'Jasna'
>>> an_ban_pet_podgan(["Maja", "Janja", "Sabina"])
'Maja'

Za tiste, ki ste že malo pozabili; celotna izštevanka se glasi: "an ban, pet podgan, štiri miši, v'uh-me piši, vija, vaja, ven." (11 členov).

Rešitev

def an_ban_pet_podgan(xs):
    i = 0
    for j in range(len(xs) - 1):
        i = (i + 10) % len(xs)
        xs.pop(i)
    return xs[0]

Bogosort

Bogosort spada med neumnejše algoritme za sortiranje: seznam sortira tako, da za vsako permutacijo elementov preveri, ali je urejena. (Koliko časa bo v povprečju potreboval, da najde ustrezno permutacijo?) Napišite funkcijo bogosort(seznam), ki sprejme seznam števil in vrne nov seznam z istimi števili, urejenimi po velikosti. V pomoč vam bo funkcija permutations iz modula itertools. Pri tej nalogi ne uporabljajte funkcije sorted ali metode list.sort.

Rešitev

import itertools
def bogosort(seznam):
    for p in itertools.permutations(seznam):
        for a, b in zip(p, p[1:]):
            if a > b:
                break
        else:
            return list(p)

XKCD

Napišite funkcijo xkcd(), ki vrne naslov trenutno obljavljenega stripa xkcd.

>>> xkcd()
'Curve-Fitting'

Namig: vsebino spletne strani na naslovu <url> dobimo tako, da uvozimo modul urllib.request in poženemo:

>>> urllib.request.urlopen(<url>).read().decode('utf-8')
'<!DOCTYPE html>\n<html>\n<head>\n…'

Rešitev

def xkcd():
    src = urllib.request.urlopen('https://xkcd.com').read().decode('utf-8')
    for line in src.strip().split('\n'):
        if line.startswith('<title>xkcd: '):
            return line[13:-8]

Last modified: Friday, 13 November 2020, 12:45 PM