Preskoči na glavno vsebino
Učilnica FRI 25/26
  • Domov
  • Koledar
  • Več
Slovenščina ‎(sl)‎
English ‎(en)‎ Slovenščina ‎(sl)‎ Македонски ‎(mk)‎ Русский ‎(ru)‎ 한국어 ‎(ko)‎
Trenutno uporabljate gostujoči dostop
Prijavite se
Učilnica FRI 25/26
Domov Koledar
Razširi vse Skrči vse
  1. Nadzorna plošča
  2. p1
  3. Oblikovanje nizov in delo z datotekami
  4. Zapisovanje ovir

Zapisovanje ovir

Zahteve zaključka
Rok za oddajo: ponedeljek, 15. december 2025, 14.15

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 in
  • preberi_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 število x (to_bytes je 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(), ker 42.to_bytes() ne gre v sintakso),
  • open(ime_datoteke, "rb") odpre datoteko za branje v binarnem načinu,
  • datoteka.read(n) prebere n bajtov iz datoteke in jih vrne kot objekt tipa bytes,
  • če je b objekt tipa bytes, potem b[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 brez iter.

Testi

  • testi.py testi.py
    8. december 2025, 23:35
Trenutno uporabljate gostujoči dostop (Prijavite se)
Pridobi mobilno aplikacijo
Stran poganja Moodle
Obvestilo o avtorskih pravicah