Zapisovanje ovir
Obvezna naloga
Mednarodni standard ISO-1234 za zapis pozicij ovir na kolesarskih poteh je takšen.
- Vsaka vrstica datoteke se nanaša na eno "vrstico" kolesarske poti. Vrstice so urejene naraščajoče.
- Prva številka v vrstici je koordinata y, zapisana na 3 mesta, z vodilnimi ničlami. Koordinata 42 je torej zapisana kot
042. - Sledi dvopičje.
- Sledijo pari; začetni in končni x sta ločena z
-. Zapisana sta na 4 mesta, pri čemer je začetna koordinata poravnana desno, končna pa levo.
Če komu zveni zapleteno, živi v zmoti. Preprosto je: ovire
{4: [(5, 6), (9, 11)],
13: [(5, 8), (9, 11), (17, 19), (22, 25), (90, 100)],
5: [(9, 11), (19, 20), (30, 34)],
}
zapišemo kot
004: 5-6 9-11
005: 9-11 19-20 30-34
013: 5-8 9-11 17-19 22-25 90-100
Napiši funkcijo zapisi_ovire(ime_datoteke, ovire), ki v datoteko s podanim imenom shrani podane ovire v takšni obliki. Ovire so tokrat podane v obliki slovarja: ključi so številke vrstic, pripadajoče vrednosti pa seznami parov začetkov in koncev ovir.
Testi bodo funkciji vsakič podali drugačno ime datoteke (konkretno: trenutni čas). Če se test izvede uspešno, bodo datoteko pobrisali, sicer jo bodo pustili (in se bodo začele nabirati), tako da lahko vidite, kaj je funkcija (napačno) zapisala vanjo.
Pazi: vrstni red ključev v slovarju ni nujno pravilen. Slovarja ne moremo urediti. Potrebno bo iti čez, hm, urejen seznam ključev. (Opravičujem se za spoiler.)
Nasvet: ne poskušajte sestaviti vzorca, ki bo izpisal celotno vrstico. To se praktično ne da (vsaj ne z f-nizi). Pač pa izpišite najprej številko in nato (v zanki prek ovir v vrstici) posamične ovire.
Dodatna naloga
Oddelek za gozdarske dejavnosti in motorni promet je ponosen na svoje inovacije. (Temu na primer, da so kolesarjem na Slovenski cesti omogočili voziti slalom med avtobusi, z vso resnostjo pravijo "inovacija v svetovnem merilu". Kar dejansko je.)
V okviru te domače naloge so predstavili novo obliko zapisa ovir. Standard MOL-666 zapiše gornje ovire takole:
4
5
6
9
11
5
9
11
19
20
30
34
13
5
8
9
11
17
19
22
25
90
100
169
1
2
Kot navaja MOL, je novi standard namenjen še večjemu spodbujanju kolesarjenja in trajnostne mobilnosti, hkrati pa tudi hitrejšemu zelenemu prehodu v brezogljično družbo.
Napiši funkcijo preberi_ovire(ime_datoteke), ki prebere ovire iz takšne datoteke v slovar.
Testno datoteko bodo sestavili testi ob prvem zagonu. Njeno ime bo "ovire.txt", vendar naj bo funkcija napisana tako, da zna prebrati datoteko s poljubnim podanim imenom.
Namig: ker sem na predavanjih tako nasprotoval open(ime_datoteke).read().split("\n") moram zdaj povedati, da se včasih splača open(ime_datoteke).read().split("\n\n").
Še bolj dodatna naloga
Gornja naloga je v resnici stara dve leti. Oddelek za gozdarske dejavnosti in motorni promet je medtem ustanovil Pododdelek za trajnostno zelene inovacije mobilnostnega prehoda v brezogljično družbo in ta je v svojem raziskovalnem centru izumil nov standard zapisa ovir, imenovan TZI-42. Gornje ovire je zapisal s 26 bajti. Če bi imel samo vrstico 4 iz gornjega primera (torej, v splošnem, eno samo vrstico z dvema ovirama), bi jim zadoščalo 6 bajtov. Kot poseben uspeh, s katerim so se pohvalili tudi na več mednarodnih konferencah, so pokazali, da lahko nič ovir zapišejo z nič bajti; v zaključku so osuplim poslušalcem na posebni prosojnici ponavadi pokazali, da je to tudi teoretični minimum dolžine datoteke.
Zdi se, da je število bajtov, potrebnih za zapis enako (številu vrstic + številu ovir) krat dva.
Avtor formata je dobil boljšo službo v zasebnem sektorju (bojda je bil že prej v popoldanskem času programiral spletne strani v Phpju) in ostalim pozabil povedati, kako format deluje.
Vaša naloga je napisati funkciji
zapisi_b(ime_datoteke, ovire), ki zapiše ovire enako učinkovito kot TZI-42 inpreberi_b(ime_datoteke), ki prebere ovire iz datoteke, kakršno sestavi prejšnja funkcija.
Predpostaviti smete vse, kar smiselnega. Recimo, da so številke vrstic in stolpcev med 1 in 255 (dokler Angelca ne reče drugače).
Na predavanju nisem pokazal binarnih datotek, zato bom pospoilal:
open(ime_datoteke, "wb")odpre datoteko za pisanje v binarnem načinu,datoteka.write(x.to_bytes())je eden od načinov, da vanjo zapišemo številox(to_bytesje metoda celih števil v Pythonu, https://docs.python.org/3/library/stdtypes.html#int.to_bytes; če hočemo zapisati konstanto, jo moramo dati v oklepaj,(42).to_bytes(), ker42.to_bytes()ne gre v sintakso),open(ime_datoteke, "rb")odpre datoteko za branje v binarnem načinu,datoteka.read(n)preberenbajtov iz datoteke in jih vrne kot objekt tipabytes,- če je
bobjekt tipabytes, potemb[10]vrne deseti bajt (število med 0 in 255), - namesto tega pa sem sam v svoji rešitvi nekje napisal
f = iter(open(ime_datoteke, "rb").read()), ker se mi je zdelo praktično; gre seveda tudi breziter.
Testi
- 8. december 2025, 23:35