Naloge

Nek računalnik hrani arhiv vseh sprememb datotek: vsakič, ko shranimo datoteko, zabeleži trenutni datum, ime datoteke in njeno dolžino. Podatki so lahko, recimo, takšni:

arhiv = [
    "12/31/2018 ime_dat.avi 21532",
    "10/16/2020 ime_dat.avi 314236",
    "10/16/2020 some_other.avi 314236",
    "1/1/1971 ime_dat.avi 312353",
    "5/16/2020 ime_dat.avi 21532",
    "10/18/2020 another_file.avi 351352",
    "10/18/2018 another_file.avi 314236",
]

Vsaka vrstica opisuje spremembo datoteke:

  • datum v obliki mesec/dan/leto,
  • ime datoteke; le-to nikoli ne vsebuje presledkov,
  • številka, ki predstavlja dolžino datoteke.

Med podatki so presledki. Vrstice niso urejene po datumu ali čemerkoli drugem.

Na disku, ki ga opisuje gornji seznam, so trenutno samo tri datoteke ("ime_dat.avi", "some_other.avi" in "another_file.avi"). Datoteka "ime_dat.avi" je bila shranjena štirikrat, in sicer 31. decembra 2018, 16. oktobra 2020, 1. januarja 1971, in 16. maja 2020. Na disku le zadnja različica, s 16. oktobra 2020.

Prve štiri funkcije, ki jih moraš napisati, prejmejo ime vrstice, kot je gornja. Te štiri funkcije se lahko seveda kličejo med sabo. Katera kliče katero, je stvar tvoje odločitve; nalogo je mogoče rešiti na različne načine.

  • datum(vrstica) vrne datum kot terko (leto, mesec, dan). Klic datum("5/15/1970 ime_dat.avi 42") vrne (1970, 5, 15).

    Rešitev

    def datum(vrstica):
      ime, datum, dolzina = vrstica.split()
      mes, dan, let = datum.split("/")
      return int(let), int(mes), int(dan)
    

  • ime(vrstica) vrne ime datoteke. Klic ime("5/15/1970 ime_dat.avi 42") vrne niz "ime_dat.avi".

    Rešitev

    def ime(vrstica):
      ime, datum, dolzina = vrstica.split()
      return ime
    

  • dolzina(vrstica) vrne dolžino datoteke. Klic dolzina("5/15/1970 ime_dat.avi 42") vrne 42.

    Rešitev

    def dolzina(s):
      ime, datum, dolzina = vrstica.split()
      return int(dolzina)
    

  • podatki(vrstica) vrne terko z gornjimi podatki. Klic podatki("5/15/1970 ime_dat.avi 42") vrne ((1970, 5, 15), "ime_dat.avi", 42).

    Rešitev

    def podatki(s):
      return datum(s), ime(s), dolzina(s)
    

Poleg teh štirih napiši še naslednje funkcije.

  • je_novejsa(s1, s2) prejme dve vrstici in vrne True, če ima s1 novejši (kasnejši) datum kot s2, in False, če ne. Klic je_novejsa("11/16/2020 ime.txt 316", "11/15/2015 foo.txt 314") vrne True.

    Rešitev

    def je_novejsa(s1, s2):
      return datum(s1) > datum(s2)
    

  • najnovejsa(ime_datoteke, arhiv) prejme ime datoteke in seznam, kot je na začetku naloge. Vrniti mora podatke o datoteki v času zadnje spremembe. Klic najnovejsa("ime_dat.avi", arhiv) (pri čemer je arhiv takšen, kot je definiran zgoraj) vrne ((2020, 10, 16), "ime_dat.avi", 314236), saj so to podatki o datoteki, kot je bila shranjena na zadnjega izmed štirih datumov, ko smo spreminjali to datoteko.

    Rešitev

    def najnovejsa(ime, arhiv):
      naj_pod = None
      naj_dat = None
      for vrstica in arhiv:
          pod = dat, ime2, _2 = podatki(vrstica)
          if ime == ime2 and (naj_dat == None or dat > naj_dat):
              naj_pod = pod
              naj_dat = dat
      return naj_pod
    

  • datumi(ime_datoteke, arhiv) vrne datume sprememb podane datoteke. Datumi morajo biti urejeni od kasnejših proti starejšim. Klic datumi("ime_dat.avi", arhiv) vrne [(2020, 10, 16), (2020, 5, 16), (2018, 12, 31), (1971, 1, 1)]

    Rešitev

    def datumi(ime, arhiv):
      dats = []
      for vrstica in arhiv:
          dat, im, _ = podatki(vrstica)
          if im == ime:
              dats.append(dat)
      return sorted(dats, reverse=True)
    

  • brez(ime_datoteke, arhiv) vrne seznam, ki je enak podanemu, le brez vrstica, ki se nanašajo na podano datoteko. Klic brez("ime_dat.avi", arhiv) vrne

    [
      "10/16/2020 some_other.avi 314236",
      "10/18/2020 another_file.avi 351352",
      "10/18/2018 another_file.avi 314236",
    ]
    

    Rešitev

    def brez(im, arhiv):
      filtriran = []
      for vrstica in arhiv:
          if ime(vrstica) != im:
              filtriran.append(vrstica)
      return filtriran
    

Zadnja sprememba: sreda, 16. november 2022, 17.19