Razbiranje ovir

Rok za oddajo: sreda, 23. november 2022, 11.15

Izvedši, da je njihov zemljevid s pikami in lojtrami neuporaben in živcira študente računalništva, kognitivne znanosti, upravne informatike in digitalnega jezikovslovja, so začeli na Oddelku za gospodarstvo in motorizirani promet Mestne občine Ljubljana pripravljati podatke v drugačni obliki. Zato bo potrebno napisati nove funkcije za njihovo branje.

Ovire so zapisane v večvrstičnem nizu:

4: 5-6
13: 90-100, 5-8, 9-11
5: 9-11, 19-20, 30-34
4: 9-11
13:  22-25, 17-19

To pomeni, da je v 4. vrstici ovira od 5 do 6. V 13. vrstici so ovire od 90 do 100, od 5 do 8 in od 9 do 11. V 5. so od ... In potem so se spomnili, da je v 4. vrstici še ena ovira. In v 13. še dve.

Oblika vsake posamične vrstice je torej takšna: imamo številko vrstice, ki ji sledi dvopičje, temu pa pari koordinat (x0, x1). Med koordinatama je -, med pari pa vejice. Kot vidimo zgoraj.

Kako iz/do večvrstičnih nizov

Če je s večvrstični niz, ga razbijemo v seznam posamičnih vrstic tako, da pokličemo s.splitlines().

Če imamo niza prva = "Prva vrstica" in druga = "Druga vrstica", ga zložimo v dvovrstični niz, tako da seštejemo prva + "\n" + druga. Kombinacija \n pomeni prehod v novo vrstico.

Obvezna naloga

Napiši naslednje funkcije.

  • vrstica(s) prejme niz z eno vrstico in vrne seznam trojk (x0, x1, y), ki predstavljajo ovire v tej vrstici.

    Klic vrstica("4: 1-3, 5-11, 15-33") vrne seznam [(1, 3, 4), (5, 11, 4), (15, 33, 4)].

  • preberi(s) celoten, večvrstični niz z ovirami in vrne seznam ovir. Ovire naj bodo shranjene v takšnem vrstnem redu, v kakršnem se pojavljajo.

    Če jo pokličemo z gornjim nizom, vrne

    [(5, 6, 4),
     (90, 100, 13), (5, 8, 13), (9, 11, 13),
     (9, 11, 5), (19, 20, 5), (30, 34, 5),
     (9, 11, 4),
     (22, 25, 13), (17, 19, 13)]
    
  • intervali(xs) prejme seznam parov (x0, x1) in vrne seznam nizov, ki opisujejo te intervale.

    Klic intervali([(6, 10), (12, 16), (20, 22), (98, 102)]) vrne ["6-10", "12-16", "20-22", "98-102"].

  • zapisi_vrstico(y, xs) prejme številko vrstice in seznam parov (x0, x1). Vrniti mora opis ene vrstice.

    Klic zapisi_vrstico(5, [(6, 10), (12, 16)])) vrne niz "5: 6-10, 12-16". Pazi: nobenih odvečnih ali manjkajočih presledkov ali vejic!

Dodatna naloga

Napiši funkcijo zapisi(ovire), ki prejme seznam ovir in vrne niz, ki vsebuje opis ovir v novi obliki. Za razliko od kaosa, ki ga dobimo od MOL, pa mora biti zapis urejen: vrstice se pojavljajo le enkrat in v pravem vrstnem redu, pa tudi ovire morajo biti urejene od leve proti desni.

Klic

zapisi([(5, 6, 4),
        (90, 100, 13), (5, 8, 13), (9, 11, 13),
        (9, 11, 5), (19, 20, 5), (30, 34, 5),
        (9, 11, 4),
        (22, 25, 13), (17, 19, 13)])

vrne niz

4: 5-6, 9-11
5: 9-11, 19-20, 30-34
13: 5-8, 9-11, 17-19, 22-25, 90-100

Spet: niz mora biti v točno takšni obliki, brez odvečnih ali manjkajočih presledkov ali vejic.

Testi