Skoči na vsebino

P1 2021/22 - 04 naloga Tour - resitev Aljaz S.

# -*- coding: utf-8 -*-
from math import sqrt

def podatek(kljuc, podatki):
    for i, v in podatki:
        if (i == kljuc): return v
    return None

def razdalja(t1, t2):
    return sqrt(pow(t1[0] - t1[1], 2) + pow(t2[0] - t2[1], 2))

def oddaljenost (kraj1, kraj2, koordinate):
    return razdalja(podatek(kraj1, koordinate), podatek(kraj2, koordinate))

"""
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.
"""
def visina (kraj1, kraj2, visine):
    return podatek(kraj2, visine) - podatek(kraj1, visine)


"""
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.
"""
def cas(s, h):
    return 2.4 * s + (1 / 12 * h if h > 0 else 1 / 250 * h)

"""
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š!)
"""

def cas_med(kraj1, kraj2, koordinate, visine):
    return cas(oddaljenost(kraj1, kraj2, koordinate), visina(kraj1, kraj2, visine))

"""
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.
"""
def skupni_cas(kraji, koordinate, visine):
    koncni_cas = 0
    for kraj1, kraj2 in zip(kraji, kraji[1::]):
        koncni_cas += cas(oddaljenost(kraj1, kraj2, koordinate), visina(kraj1, kraj2, visine))
    return koncni_cas

"""
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).
"""
def skrajsaj(kraji, koordinate, visine):
    koncne_dolzine_brez_kraja = []

    for i in range(0, len(kraji)):
        koncne_dolzine_brez_kraja += [ skupni_cas(kraji[:i] + kraji[i + 1:], koordinate, visine) ]

    min_koncna_dolzina_index = koncne_dolzine_brez_kraja.index(min(koncne_dolzine_brez_kraja))
    return kraji[:min_koncna_dolzina_index] + kraji[min_koncna_dolzina_index + 1:]




"""
TEST THE FUNCTION DEFINITIONS
"""
# from os import get_terminal_size
# class clrs:
#     head = '\033[95m'
#     blue = '\033[94m'
#     cyan = '\033[96m'
#     ok = '\033[92m'
#     warn = '\033[93m'
#     fail = '\033[91m'
#     bold = '\033[1m'
#     under = '\033[4m'
#     END = '\033[0m'

# def test (fn, args, expected = None):
#     fn_val = fn(*args)
#     fn_str = clrs.blue + fn.__name__ + "(" + clrs.END + ', '.join(str(i) for i in args) + clrs.blue + ")"
#     status = (clrs.ok + "Pass" if fn_val == expected else clrs.fail + "Fail")

#     spacer = " " * (get_terminal_size().columns - len(str(fn_val)) - len(str(fn_str)) - len(str(status)))
#     print(fn_str, spacer, fn_val, status, clrs.END)

# krajiCoords = [('Piran', (0, 0)), ('Koper', (8, 2)), ('Žiri', (39, 60))]
# krajiVisine = [("Piran", 23), ("Koper", 4), ("Žiri", 481)]
# test(podatek, (42, [(42, "6 * 8"), (33, "11 * 3")]), "6 * 8")
# test(podatek, ("Koper", krajiCoords), (8, 2))
# test(podatek, ("Žiri", krajiVisine), 481)
# test(podatek, ("Žiri", [("Piran", 23), ("Koper", 4)]), None)
# test(razdalja, ((0, 0), (3, 4)), 5)
# test(oddaljenost, ("Piran", "Koper", krajiCoords), 8)
# test(visina, ("Koper", "Žiri", krajiVisine), 477)
# test(cas, (2, 300), 29.8)
# test(cas, (10, -100), 23.6)
# test(cas_med, ("Koper", "Žiri", krajiCoords, krajiVisine), False)
# test(skupni_cas, (["Koper", "Žiri", "Piran"], krajiCoords, krajiVisine), False)
# test(skrajsaj, (["Piran", "Ljubljana", "Koper"], koordinate, visine), ["Piran", "Koper"])
# test(skrajsaj, (["Ljubljana", "Piran", "Koper"], koordinate, visine), ["Piran", "Koper"])
# test(skrajsaj, (["Piran", "Koper", "Ljubljana"], koordinate, visine), ["Piran", "Koper"])

Zadnja posodobitev: May 7, 2022