2020: Datotečni dnevnik
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). Klicdatum("5/15/1970 file with spaces.avi 42")
vrne(1970, 5, 15)
.ime(vrstica)
vrne ime datoteke. Klicime("5/15/1970 file with spaces.avi 42")
vrne niz"file with spaces.avi"
.dolzina(vrstica)
vrne dolžino datoteke. Klicdatum("5/15/1970 file with spaces.avi 42")
vrne 42.podatki(vrstica)
vrne terko z gornjimi podatki. Klicpodatki("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 vrneTrue
, če imas1
novejši (kasnejši) datum kots2
, inFalse
, če ne. Klicje_novejsa("11/16/2020 ime.txt 316", "11/15/2015 foo.txt 314")
vrneTrue
.najnovejsa(ime_datoteke, arhiv)
prejme ime datoteke in seznam, kot je na začetku naloge. Vrniti mora podatke o datoteki v času zadnje spremembe. Klicnajnovejsa("ime dat.avi", arhiv)
(pri čemer jearhiv
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. Klicdatumi("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 seznamaarhiv
odstrani vse vrstice, ki se nanašajo na datoteko s podanim imenom. Klicodstrani("ime dat.avi", arhiv)
spremeni gornji seznam varhiv = ["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
- 11. november 2020, 23:28