Klicane telefonske številke

Napiši funkcijo klici(s), ki bo kot atribut dobila seznam vseh Majinih klicev in vrnila množico vseh številk, ki jih je Maja klicala.


>>>klici([508732, 556442, 334878, 951147, 508723, 508723])
{508732, 556442, 334878, 951147, 508723}

Učenci v razredu

V razred sta najprej vstopili Ana in Hana, za njima pa še Barbara in Manja. Med odmorom je razred zapustila Hana, vanj pa sta vstopila Miha in Peter. Po koncu druge ure so razred zapustili še Manja, Barbara in Miha. Kdo je ostal v razredu?

Napišite funkcijo v_razredu(prisli, odsli), ki kot vhodne podatke dobi seznama učencev, ki so vstopili v razred, in seznam tistih, ki so odšli iz razreda, in vrne množico učencev, ki so ostali v razredu.

Nekaj primerov:


>>>v_razredu(["Ana", "Hana", "Barbara"], [])
{"Ana", "Hana", "Barbara"}
>>>v_razredu(["Ana", "Hana", "Barbara", "Manja", "Miha", "Peter"], ["Hana", "Manja", "Barbara", "Miha"])
{"Ana", "Peter"}

Pokaži črke

Napiši funkcijo pokazi_crke(beseda, crke), ki kot argument sprejme besedo in množico (set) črk. Funkcija mora vrniti besedo, v kateri so vse črke, ki ne nastopajo v množici crke, spremenjene v pike.


>>> pokazi_crke("PONUDNIK", set(["O", "N"]))
'.ON..N..'
>>> pokazi_crke("PONUDNIK", set(["O", "I", "K"]))
'.O....IK'
>>> pokazi_crke("PONUDNIK", set())
'........'
>>> pokazi_crke("PONUDNIK", set(["P", "O", "N", "I", "K", "U"]))
'PONU.NIK'

Raznolikost

Napiši funkcijo najraznolika(bes), ki kot argument prejme seznam nizov in kot rezultat vrne niz, ki ima največ različnih znakov. Male in velike črke upoštevaj kot iste znake - beseda "MamA" ima samo dva različna znaka. Če obstaja več besed z enakim številom različnih znakov, naj vrne prvo med njimi.


>>> besede = ["RABarbara", "izpit", "zmagA"]
>>> najraznolika(besede)
'izpit'

Podobna beseda

Sestavi funkcijo podobna(beseda, besede), ki kot argument sprejme besedo in seznam besed in kot rezultat vrne tisto besedo iz seznama, v kateri se pojavi čim več črk, ki se pojavijo tudi v dani besedi. Vsako ujemajočo se črko štejemo le enkrat, tudi če se v obeh besedah pojavi večkrat. Funkcija naj deluje tako, da ne razlikuje med malimi in velikimi črkami. Če obstaja več enako podobnih besed, vrnite prvo med njimi.


>>> podobna("merjasec", ["ana", "berta", "cilka", "dani", "ema", "fanci", "greta", "hilda"])
'berta'
>>> podobna("zmaj", ["ana", "berta", "cilka", "dani", "ema", "fanci", "greta", "hilda"])
'ema'
>>> podobna("Krava", ["ana", "berta", "cilka", "dani", "ema", "fanci", "greta", "hilda"])
'berta'

Ana in krava ujemata v eni črki, namreč črki a in ne v dveh, pa čeprav imata po dva a-ja. (Opomba: vsaka podobnost med Berto in merjascem je zgolj naključna.)

Uporabniške skupine

Unix zapisuje skupine uporabnikov v datoteko /etc/group. Vsaka vrstica opisuje eno skupino uporabnikov. V njej so štirje podatki, ločeni z dvopičji: ime skupine, geslo, številski id in seznam uporabnikov v skupini. Uporabniška imena so ločena z vejicami. Del datoteke je lahko, recimo, takšen(primer datoteke):


ana:x:500:ana
berta:x:501:berta
cilka:x:502:cilka
dani:x:503:dani
ordinary:x:504:ana,berta,cilka,dani
taccess:x:505:berta,cilka
wusers:x:506:ana,cilka

V njej vrstica taccess:x:505:berta,cilka pravi, da sta v skupini taccess uporabnici berta in cilka. Geslo in številka sta za to nalogo nepomembna.

Napiši funkcijo beri_skupine(ime_dat), ki kot argument prejme ime datoteke groups in kot rezultat vrne slovar, katerega ključi so uporabniki, vrednosti pa skupine, v katerih je ta uporabnik (torej obratno od tega, kar je v groups, kjer za skupino izvemo, katere uporabnike vsebuje).


>>> users = beri_skupine("groups.htm")
>>> users["ana"]
['ana', 'ordinary', 'wusers']
>>> users["cilka"]
['cilka', 'ordinary', 'taccess', 'wusers']
>>> users["dani"]
['dani', 'ordinary']

Če imate težave pri reševanju, poskusite najprej s pomožnimi nalogami.

Pomožna naloga 1

Preberite datoteko groups in izpišite vse skupine uporabnikov.

Pomožna naloga 2

Poleg skupin izpišite tudi vse uporabnike v teh skupinah. Predlagam, da uporabnike shranite v seznam. Npr., tako:


skupina=ana, uporabniki so=[ana]
...
skupina=ordinary, uporabniki so=[ana,berta,cilka,dani]
...

Pomožna naloga 3

Zdaj pa napišimo program, ki prebere podatke in pripravi ustrezen slovar. Recimo, plan bi lahko bil takšen:

    1. Pripravimo si prazen slovar. Ker vemo, da bodo vrednosti seznami, lahko uporabimo razred defaultdict iz modula collections.
    2. Sprehodimo se čez zapise v datoteki groups (eno vrstico naenkrat).
      1. Shranimo skupino in uporabnike v ustrezni spremenljivki.
      2. Z zanko se sprehodimo čez uporabnike in vsakemu uporabniku dodajmo skupino (v slovar).

    S tem ste nalogo praktično že končali, napisati morate le še funkcijo. Za to nalogo ni testov, dovolj je, če deluje na priloženi datoteki.

    Izvozniki

    Poberite si datoteko s podatki o izvozu iz posameznih držav in jo shranite v direktorij, v katerem boste pisali svoj program. Odprite jo v poljubnem urejevalniku besedil in si oglejte, kako je videti. (Pazite, da je pri tem ne bi ponesreči shranili, da ne bo kaj narobe.)

    Napišite funkciji kdo_izvaza(produkt) in kaj_izvaza(drzava). Primer:

    
    >>> kdo_izvaza("rum")
    {'Jamaica', 'Puerto Rico', 'Bahamas', 'British Virgin Islands', 'Guyana', 'Anguilla', 'Barbados'}
    >>> kdo_izvaza("aircraft")
    {'Canada', 'United States', 'European Union', 'Malta', 'France'}
    >>> kdo_izvaza("nickel")
    {'Botswana', 'Colombia', 'Cuba'}
    

    Šifra

    Niz '\x19\x14\x1c]\x19\x0f\x14\t\x13\x18\t]\x12\x0e[\n\x1a\t\x18\x15\x12\x13\x1c' lahko odšifriramo z naslednjo funkcijo:

    def sifriraj(niz, kljuc):
        return ''.join(chr(ord(c) ^ (kljuc // 256**(i % 2) % 256)) for i, c in enumerate(niz))
    

    Problem je v tem, da ne poznamo ključa. Vemo le, da je nekje med 0 in 65536. Sumimo, da je originalno sporočilo v angleškem jeziku in da so vse besede slovnično pravilno zapisane. Napišite funkcijo sifra(niz), ki vrne odšifrirano sporočilo.

    >>> sifriraj('strawberry pudding', 1337)
    'JqKdNg\\wK|\x19uLa]lWb'
    >>> sifriraj('JqKdNg\\wK|\x19uLa]lWb', 1337)
    'strawberry pudding'
    >>> sifra('JqKdNg\\wK|\x19uLa]lWb')  # To funkcijo morate napisati vi
    'strawberry pudding'
    

    Namig:

    Zadnja sprememba: sreda, 4. marec 2026, 09.37