2020: Datotečni dnevnik

Rok za oddajo: torek, 17. november 2020, 23.59

Datotečni dnevnik

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 = ["10/14/2020 ime dat.avi 314236",
         "12/31/2018   ime dat.avi 21532",
         "10/16/2020 some other.avi 314236",
         "1/1/1970    file   with spaces.avi 42",
         "5/16/2020   ime dat.avi 21532",
         "10/18/2020 another file.avi 351352",
         "10/16/2020 ime dat.avi   312353",
         "10/18/2018 another file.avi 314236"]
  • Na začetku vsake vrstice je datum shranjevanja (oz. spreminjanja) datoteke v obliki mesec/dan/leto. Ne pred njim ne znotraj njega ni presledkov.
  • Sledi poljubno število presledkov.
  • Ko se ti presledki končajo, imamo ime datoteke. To lahko vsebuje presledke. Celo zaporedne presledke. Pač pa se ime datoteke nikoli ne konča ali začne s presledkom; vsi presledki na začetku ali koncu so odveč.
  • Na koncu vrstice je vedno številka ki predstavlja dolžino datoteke. Pred njo je lahko poljubno število presledkov, za njo jih gotovo ni.

Na disku, ki ga opisuje gornji seznam, so trenutno samo štiri datoteke ("ime dat.avi", "some other.avi", "file with spaces.avi" in "another file.avi"). Datoteka "ime dat.avi" je bila shranjena štirikrat, in sicer 14. oktobra 2020, 31. decembra 2018, 16. maja 2020 in 16. oktobra 2020. Tudi njena dolžina se je spreminjala. Trenutno je na disku le zadnja različica, z 16. oktobra letos.

Vrstice niso urejene po datumu ali čemerkoli drugem.

Obvezna naloga

Prve štiri funkcije, ki jih moraš napisati, prejmejo ime vrstice, kot je gornja. 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 file with spaces.avi 42") vrne (1970, 5, 15).
  • ime(vrstica) vrne ime datoteke. Klic ime("5/15/1970 file with spaces.avi 42") vrne niz "file with spaces.avi".
  • dolzina(vrstica) vrne dolžino datoteke. Klic datum("5/15/1970 file with spaces.avi 42") vrne 42.
  • podatki(vrstica) vrne terko z gornjimi podatki. Klic podatki("5/15/1970 file with spaces.avi 42") vrne ((1970, 5, 15), file with spaces.avi", 42).

Poleg teh napiši še naslednje štiri 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.
  • 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.
  • 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, 10, 14), (2020, 5, 16), (2018, 12, 31)]. Če datoteke s podanim imenom sploh ni, pač vrne prazen seznam.
  • odstrani(ime_datoteke, arhiv) iz podanega seznama arhiv odstrani vse vrstice, ki se nanašajo na datoteko s podanim imenom. Klic odstrani("ime dat.avi", arhiv) spremeni gornji seznam v

    arhiv = ["10/16/2020 some other.avi 314236",
             "1/1/1970    file   with spaces.avi 42",
             "10/18/2020 another file.avi 351352",
             "10/18/2018 another file.avi 314236"]
    

    Funkcija spreminja podani seznam in ne vrača ničesar.

Dodatna naloga

Napiši funkcijo skupna_dolzina(arhiv), ki vrne skupno dolžino vseh datotek v arhivu. Klic

skupna_dolzina([
    "10/14/2020 ime dat.avi   1",
    "5/16/2020   ime dat.avi 2",
    "10/16/2020 ime dat.avi 4",
    "12/31/2018   ime dat.avi 8",
    "10/16/2020 some other.avi 16",
    "10/18/2020 another file.avi 32",
    "10/18/2018 another file.avi 64",
]

vrne 52 (4 + 16 + 32). Upoštevati mora, očitno, le zadnje različice datotek.

Testi