29. januar

Dovoljeno:

  • uporaba vse literature in kode, ki jo najdete v Učilnici, drugje na spletu, v knjigah ... kjerkoli,
  • funkcije vseh modulov, ki jih dobite s Pythonom,
  • pisanje dodatnih funkcij (vendar ni treba),

Prepovedano:

  • vsakršna komunikacija.

Naloge

Vse naloge prinašajo enako število točk (do 15 za nepravilno rešitev, 15-20 za delujočo).

Vrhovi valov

Naloga predstavlja nadaljevanje prve naloge s prejšnjega izpita (glej rešitve).

Epidemije prihajajo v valovih. V neki državi se je število okuženih po dnevih spreminjalo tako:

okuzbe = [1, 6, 5, 0, 0, 0, 2, 8, 5, 3, 0, 5, 8, 0, 0, 0, 5, 1, 1]`
# valovi: -------           ----------     ----           -------

Tule vidimo štiri valove. Zanimajo nas vrhunci valov. V prvem valu je to drugi dan od treh (2, 3), v drugem prvi od štirih (1, 4), v tretjem drugi od dveh (2, 2), v četrtem prvi od treh (1, 3). Od obeh števil odštejemo 1 in ju delimo: tako izvemo, da so vrhovi ob [1 / 2, 1 / 3, 1 / 1, 0 / 3]. Tako odštevanje lepše opiše, kje se nahaja vrh: to se najlepše vidi v prvem valu, ko je vrh na polovici.

Če je val dolg 1, je vrh na položaju 0.

Na začetku in koncu seznama je lahko še poljubno število ničel. Med dvema valovoma je vsaj ena ničla.

Napiši funkcijo vrhovi(okuzbe), ki za podani seznam dnevnih okužb vrne položaje vrhov valov. Klic vrhovi([1, 6, 5, 0, 0, 0, 2, 8, 5, 3, 0, 5, 8, 0, 0, 0, 5, 1, 1]) torej vrne [0.5, 0.333, 1, 0].

Najpodobnejši

Seve virusov primerjajo glede na markerje. Recimo, da bomo uporabljali naslednje markerje (vendar naj vaša rešitev deluje za poljuben nabor markerjev, ne le te, ki so v testih!)

markerji = {"ATTA", "GGT", "TTG", "TCCCTC"}

V genskem materialu vzorca virusa je vsak od teh markerjev prisoten ali pa ne. (Ali je prisoten enkrat ali večkrat, ne igra vloge). Podobnost sevov opazujemo glede na to, v koliko markerjih se ujemata.

Vzemimo, recimo

        markerji =                         {"ATTA", "GGT", "TTG", "TCCCTC"}
        vzorec = "GCGCATTAGCGGTCCCTCAAAGGT"  #  1     1      0       1
        sev4 = "ATTAATTAATTAATTA"            #  1     0      0       0   => 2

Njuno ujemanje je 2: oba vsebujeta ATTA in oba ne vsebujeta TTG. (Glede preostalih dveh markerjev pa se razlikujeta.)

Napiši funkcijo najpodobnejsi(vzorec, sevi, markerji), ki prejme nek vzorec, množico znanih sevov in množico markerjev. Vrniti mora tistega izmed znanih sevov, ki je najbolj podoben vzorcu. Če je enako podobnih več, naj vrne poljubnega izmed njih.

V testih je naštetih več sevov, v komentarjih pa so na enak način kot v gornjem primeru zapisane podobnosti.

Stanje regij

V datoteki obcine.txt je seznam občin s številom prebivalcev in regijo, ki ji občina pripada. Podatki so ločeni z vejicami.

Moravče, 5354, Osrednjeslovenska
Ljubljana, 288832, Osrednjeslovenska
Koper, 51828, Primorska
Kočevje ob gozdu, 16549, Južnoslovenska
Piran, 17613, Primorska
Kamnik, 13768, Osrednjeslovenska

V datoteki okuzbe.txt je dnevno število okužb po občinah, v takšni obliki:

Kamnik: 80
Kočevje ob gozdu: 50
Ljubljana: 90

Vse občine iz druge datoteke se pojavijo tudi v prvi. Obratno ni nujno: če nekje ni novih okužb, te občine v drugi datoteki ni.

Napiši funkcijo stanje_regij(), ki prebere tidve datoteki in vrne slovar, katerega ključi so vse regije, ki se pojavijo v prvi datoteki, pripadajoča vrednost pa je delež okuženih. V gornjem primeru ključu "Osrednjeslovenska" pripada vrednost (80 + 90) / (5354 + 288832 + 13768) (število okuženih v občinah iz te regije, deljeno s število prebivalcev v vseh občinah te regije). Ključu "Primorska" pa 0, ker v primorskih občinah ni bilo okužb.

(Datoteke niso priložene, ker se sestavijo kar znotraj testov.)

Položaj vrha

Variacija na prvo nalogo. Tokrat imamo le seznam za en val. Zanima nas, na kateri dan je bilo največ okužb in koliko.

Napiši rekurzivno funkcijo argmax(s), ki za podani neprazni seznam vrne indeks in vrednost največjega elementa. Klic argmax([5, 4, 7, 8, 5, 1]) vrne (3, 8), ker se največji element, 8, pojavi na indeksu 3. Če je največjih elementov več, vrne indeks prvega od njih.

Funkcija mora biti "prava rekurzivna funkcija": razen sebe naj ne kliče drugih funkcij, razen len, poleg tega naj ne vsebuje zank.

Sledilnik

Napiši razred Sledilnik, ki ima

  • primeren konstruktor
  • in metodo nov_dan, ki kot argument sprejme število novookuženih v tekočem dnevu; predstavljaj si, da jo pokličemo vsak dan, ko vlada sporoči sveže podatke.

Poleg tega naj ima atribute

  • naj_dnevnih vsebuje največje doslej zabeleženo število dnevnih okužb,
  • tekoce_brez_okuzb pove, koliko zadnjih dni že ni bilo nobene okužbe,
  • naj_brez_okuzb pove, kako dolgo je bilo najdaljše zaporedje dni brez okužb.

Razen teh naj razred nima nobenih drugih atributov.

Poleg tega napiši razred Sledilnik2, ki je izpeljan iz razreda Sledilnik in doda še atribut

  • skupno_okuzenih, ki shranjuje skupno število okuženih.

Sledilnik2 naj smiselno uporabi oz. spreminja podedovane metode in doda čim manj kode.

Recimo, da izvedemo naslednji program.

s = Sledilnik2()
s.nov_dan(10)
s.nov_dan(15)
s.nov_dan(0)
s.nov_dan(0)
s.nov_dan(0)
s.nov_dan(0)
s.nov_dan(2)
s.nov_dan(0)
s.nov_dan(0)

Po tem je s.naj_dnevnih enak 15, s.tekoce_brez_okuzb je 2, s.naj_brez_okuzb je 4. Ker gre za Sledilnik2, je s.skupno_okuzb enak 27.

Če bi program nadaljevali z

s.nov_dan(3)

je s.naj_dnevnih še vedno 15, s.tekoce_brez_okuzb je 0, s.naj_brez_okuzb je še vedno 4 in s.skupno_okuzb enak 30.

Testi