Tour de Slovenie

Rok za oddajo: torek, 9. november 2021, 08.00

Naloga vsebuje teste. Naloga je rešena samo, če prestane vse teste.

Obvezna naloga

  1. Napiši funkcijo podatek(kljuc, podatki), ki dobi neko vrednost kljuc in nek seznam parov. Med njimi mora poiskati tisti, par, pri katerem je prva vrednost enaka podanemu ključu; funkcija mora vrniti drugo vrednost.

    • Klic podatek("Berta", [("Ana", 156), ("Berta", 167), ("Cilka", 160)]) vrne 167.
    • Klic podatek(42, [(42, "6 * 8"), (33, "11 * 3")]) vrne "6 * 8".
    • Klic podatek("Koper", [('Piran', (0, 0)), ('Koper', (8, 2)), ('Žiri', (39, 60))]) vrne (8, 2).
    • Klic podatek("Žiri", [("Piran", 23), ("Koper", 4), ("Žiri", 481)]) vrne 481.

Če ključa ne najde, (npr. v klicu podatek("Žiri", [("Piran", 23), ("Koper", 4)])) mora vrniti None.

  1. Napiši funkcijo razdalja(t1, t2), ki prejme dve terki, ki predstavljata koordinati točk na ravnini. Vrniti mora evklidsko razdaljo med točkama. Klic razdalja((0, 0), (3, 4)) mora vrniti 5.

  2. Napiši funkcijo oddaljenost(kraj1, kraj2, koordinate), ki prejme imeni dveh krajev in seznam, ki vsebuje koordinate krajev v takšni obliki, kot ga vidiš v tretjem primeru pri prvi funkciji. Funkcija mora vrniti evklidsko razdaljo med krajema. (Dober nasvet: funkcija naj kliče prejšnji funkciji.) Predpostaviti smeš, da se koordinate obeh krajev nahajo v seznamu.

  3. Napiši funkcijo visina(kraj1, kraj2, visine), ki prejme imeni dveh krajev in višine krajev v seznamu, kot ga vidiš v četrtem primeru pri prvi funkciji. Funkcija naj vrne višinsko razliko (vzpon) od prvega kraja do drugega; če je prvi višji, funkcija vrne negativno vrednost. Spet smeš predpostaviti, da sta višini obeh krajev znani.

  4. Napiši funkcijo cas(s, h), ki vrne čas, ki ga porabi nek kolesar, da prevozi pot dolžine s (v kilometrih), ki se dvigne za h (v metrih; h je lahko tudi negativen, če gre za spust). Čas izračunamo tako:

    • kolesar v osnovi porabi 2,4 minute za kilometer razdalje.
    • Če gre za dvig, porabi poleg tega še 1 / 12 minute za vsak meter višine;
    • če gre za spust, pa se čas zmanjša za 1 / 250 minute za vsak meter spusta.

    Primera:

    • Klic cas(2, 300) vrne 29,8: za 2 km porabi 2 * 2,4 = 4,8 minut, poleg tega pa porabi 1 / 12 * 300 = 25 minut zaradi 300 m dviga.
    • Klic cas(10, -100) vrne 23,6: za 10 km porabi 10 * 2,4 = 24 minut, vendar se to zmanjša za 100 / 250 = 0.4 minute zaradi spuščanja.

(Posebej drugi primer kaže, da vsaka podobnost te formule z resničnimi dogodki ni zgolj naključna temveč tudi ne prav zelo verjetna.)

  1. Napiši funkcijo cas_med(kraj1, kraj2, koordinate, visine), ki vrne čas, ki ga bo kolesar potreboval za vožnjo od prvega do drugega kraja. Pomen argumentov in formule so takšne kot v prejšnjih nalogah. (Uporabljaj funkcije, ki jih že imaš!)

  2. Napiši funkcijo skupni_cas(kraji, koordinate, visine), ki prejme seznam krajev, skozi katere bo šel kolesar, in vrne skupni čas, ki ga bo porabil za to pot.

Dodatna naloga

Kolesar bi rad čimbolj skrajšal čas potovanja. Izpustiti sme en kraj - lahko prvega, lahko zadnjega, lahko kateregakoli vmes.

Napiši funkcijo skrajsaj(kraji, koordinate, visine), ki vrne seznam brez tega kraja. Klic skrajsaj(["Piran", "Ljubljana", "Koper"], koordinate, visine) vrne ["Piran", "Koper"]. Enak rezultat vrneta tudi klica skrajsaj(["Ljubljana", "Piran", "Koper"], koordinate, visine) in skrajsaj(["Piran", "Koper", "Ljubljana"], koordinate, visine).

Testi