Covid-19

V domači nalogi je potrebno napisati nekaj več funkcij, vendar je večina trivialnih. Zaresno programiranje se začne šele pri zadnjih treh.

Obvezna naloga

Požvižgale so se na prepovedi in skupaj kofetkale, telovadile ...

Takole lahko predstavimo, kdo je bil kje.

obiski = [("Ana", "kava"), ("Berta", "kava"), ("Cilka", "telovadba"),
          ("Dani", "zdravnik"), ("Ana", "zdravnik"), ("Cilka", "kava"),
          ("Ema", "telovadba"), ("Fanči", "telovadba"),
          ("Greta", "telovadba")]

Napiši naslednje funkcije:

  • osebe(obiski) prejme seznam, kot je gornji, in vrne množico imen vseh oseb, ki se pojavljajo v njih; za gornje podatke vrne {"Ana", "Berta", "Cilka", "Dani", "Ema", "Fanči", "Greta"}.

  • aktivnosti(obiski) prejme seznam, kot je gornji in vrne množico vseh aktivnosti; v gornjem primeru {"kava", "telovadba", "zdravnik"}.

  • udelezenci(aktivnost, obiski) prejme ime aktivnosti, na primer "kava" in seznam, kot je gornji, ter vrne množico imen vseh, ki so sodelovali v tej aktivnosti (torej {"Ana", "Berta", "Cilka"}.)

  • po_aktivnostih(obiski) prav tako prejme seznam, vrne pa slovar, katerega ključi so aktivnosti, vrednosti pa osebe, ki so se udeleževale te aktivnosti, na primer

    {"kava": {"Ana", "Berta", "Cilka"},
     "zdravnik": {"Ana", "Dani"},
     "telovadba": {"Cilka", "Ema"}}
    
  • skupine(obiski) vrne seznam množic ljudi, ki so se družile ob posameznih aktivnostih. Za gornji primer vrne [{"Ana", "Berta", "Cilka"}, {"Ana", "Dani"}, {"Cilka", "Ema"}]. Vrstni red množic v seznamu je lahko poljuben.

  • okuzeni(skupine, nosilci) prejme seznam skupin, kot ga vrača prejšnja funkcija, in množico ljudi, za katere vemo, da so okuženi (nosilci). Funkcija vrne množico imen vseh ljudi, ki so jih nosilci potencialno okužili. Za skupine iz prejšnjega primera mora klic okuzeni(skupine, {"Cilka", "Berta"}) vrniti {"Ana", "Ema"}.

  • zlati_prinasalec(skupine) vrne ime osebe, ki lahko okuži največ ljudi, torej človeka, ki se je družil z največ drugimi ljudmi. Pazi, to ni nujno tisti, ki je v največ skupinah! Kadar je enako "zlatih" oseb več, je Zlatko tisti, ki je prej po abecedi. Za gornje skupine lahko Ana in Cilka okužita po tri ljudi, zato funkcija vrne "Ana".

  • korakov_do_vseh(skupine, prvi), ki prejme skupine in prvega okuženega. Vrne število korakov, po katerih bodo okuženi vsi. Če pa slučajno obstaja kdo (ali skupina ljudi), ki ga (jih) okužba nikoli ne doseže, ker se ni(so) družil(i) z drugimi, naj funkcija vrne None.

    Recimo, da imamo skupine

    [{"Cilka", "Ema", "Jana", "Saša"},
    {"Ema"},
    {"Fanči", "Greta", "Saša"},
    {"Greta", "Nina"},
    {"Greta", "Olga", "Rebeka"},
    {"Micka", "Ana", "Klara"},
    {"Fanči", "Iva", "Berta", "Špela"},
    {"Klara", "Cilka", "Dani"},
    {"Petra", "Dani", "Lara", "Špela"}]
    

    in da je prvookužena Ana. Ana bo okužila Micko in Klaro. V drugem koraku bosta tidve okužili Dani in Cilko. V tretjem koraku bosta tidve okužili Laro, Jano, Petro, Sašo, Emo in Špelo. V četrtem koraku bodo te okužile Berto, Fanči, Greto in Ivo. V petek bodo le-te okužile Olgo, Nino in Rebeko. Da bodo bolni vsi, bo torej potrebnih pet korakov - če začnemo z Ano. Funkcija zato v tem primeru vrne 5.

    korak  okuženi
    0 Ana
    1 Micka, Klara
    2 Dani, Cilka
    3 Lara, Jana, Petra, Saša, Ema, Špela
    4 Berta, Fanči, Greta, Iva
    5  Olga, Nina, Rebeka

Dodatna naloga

Vse funkcije razen zadnjih treh (okuženi, zlati_prinasalec, korakov_do_vseh) napiši s pomočjo izpeljanih seznamov, množic, slovarjev, tako da bodo dolge le eno vrstico - vsebovale bodo samo return .... Pri tem seveda ne smeš definirati dodatnih funkcij, saj lahko potem vse delo opraviš v njih.

Izziv

Naštudiraj funkcijo functools.reduce dodatne argumente funkcij, kot so min, max ali sort ... in v eni vrstici napiši vse funkcije razen korakov_do_vseh. (reduce seveda uporabi, kjer ga potrebuješ. Kjer ne, ne.)

Testi