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
.