Izvrstni sesalec
Prej ko začnemo, samo pokažem nekaj v zvezi s pairwise in razpakiranjem.
Funkcijo pairwise, ki jo najdemo v modulu itertools, sem pokazal na predavanju. Klic pairwise(s) je ekvivalenten zip(s, s[1:]) (le da deluje za širši nabor možnih s, ne samo za sezname).
from itertools import pairwise
for t in pairwise([40, 1, 20, 33]):
print(t)
izpiše
(40, 1)
(1, 20)
(20, 33)
Rezultat pairwise, torej par zaporednih elementov, skoraj vedno razpakiramo kar v zanki, torej
for x, y in pairwise([40, 1, 20, 33]):
print(x, y)
Če imamo neko pot sesalca, na primer
pot = [(0, 0), (1, 0), (2, 0), (2, 1)]
bo pairwise spet vračal pare zaporednih elementov - tule torej pare parov.
for t in pairwise(pot):
print(t)
izpiše
((0, 0), (1, 0))
((1, 0), (2, 0))
((2, 0), (2, 1))
To lahko seveda razpakiramo:
for a, b in pairwise(pot):
print("a =", a, "in b =", b)
izpiše
a = (0, 0) in b = (1, 0)
a = (1, 0) in b = (2, 0)
a = (2, 0) in b = (2, 1)
Ker sta tudi a in b para, pa lahko razpakiramo še bolj:
for (x1, y1), (x2, y2) in pairwise(pot):
print("x1 =", x1, " y1 =", y1, " x2 =", x2, " y2 =", y2)
izpiše
x1 = 0 y1 = 0 x2 = 1 y2 = 0
x1 = 1 y1 = 0 x2 = 2 y2 = 0
x1 = 2 y1 = 0 x2 = 2 y2 = 1
To zna priti prav pri nekaterih nalogah.
Obvezna naloga
Naslednje funkcije morate rešiti z uporabo izpeljanih seznamov, slovarjev oziroma množic. Funkcije torej ne smejo vsebovati drugega kot return, v katerem izračunate ali sestavite, kar mora funkcija vrniti.
Argument pot podaja seznam polj, ki jih obišče sesalec (v takem vrstnem redu, kot jih je obiskal), na primer [(0, 0), (1, 0), (2, 0), (2, 1)]. Nekatere funkcije sprejemajo še argument ovire, ki je množica polj, na katerih stojijo ovire. Sesalec v tej nalogi preprosto prevozi oviro.
Napišite naslednje funkcije.
skrajno_gor(pot)vrne največjo y koordinato na poti.stolpci(pot)vrne množico x koordinat, ki jih sesalec obišče.naj_razdalja(pot)vrne razdaljo do najbolj oddaljenega polja. Razdalja do polja (x, y) je |x| + |y| (ne Evklidska, temveč Manhattanska razdalja!)povozene_ovire(pot, ovire)vrne število povoženih ovir. Če isto oviro povozi večkrat, jo tudi štejemo večkrat!zadetki_ovir(pot, ovire)vrne slovar, katerega ključi so koordinate ovir, pripadajoče vrednosti pa povedo, kolikokrat je bila posamezna ovira povožena. Kliczadetki_ovir([(0, 0), (0, 1), (0, 2), (0, 1), (0, 2), (0, 1)], {(0, 0), (0, 1), (4, 2)})vrne{(0, 0): 1, (0, 1): 3, (4, 2): 0}.vodoravni(pot)vrne število vodoravnih premikov sesalca. Sesalec se vedno premakne bodisi vodoravno bodisi navpično.desno(pot)vrne število premikov na desno.
Dodatna naloga
na_poljih(pot)vrne slovar, katerega ključi so obiskana polja, vrednosti pa povedo, kolikokrat je bilo dotično polje obiskano.razdalja(pot)vrne skupno razdaljo, ki jo je sesalec prevozil. Pri tej nalogi se sesalec lahko premakne tudi za več polj, na primer[(0, 0), (0, 4), (2, 4), (5, 4), (5, 2)]. Še vedno pa se premika le vodoravno ali navpično, ne diagonalno.
Testi
- 17 3월 2026, 8:00 PM