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. pef
  3. Generatorji ter izpeljani seznami, množice in slovarji
  4. Izvrstni sesalec

Izvrstni sesalec

Zahteve zaključka
Rok za oddajo: torek, 24. marec 2026, 09.40

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.

  1. skrajno_gor(pot) vrne največjo y koordinato na poti.
  2. stolpci(pot) vrne množico x koordinat, ki jih sesalec obišče.
  3. naj_razdalja(pot) vrne razdaljo do najbolj oddaljenega polja. Razdalja do polja (x, y) je |x| + |y| (ne Evklidska, temveč Manhattanska razdalja!)
  4. povozene_ovire(pot, ovire) vrne število povoženih ovir. Če isto oviro povozi večkrat, jo tudi štejemo večkrat!
  5. zadetki_ovir(pot, ovire) vrne slovar, katerega ključi so koordinate ovir, pripadajoče vrednosti pa povedo, kolikokrat je bila posamezna ovira povožena. Klic zadetki_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}.
  6. vodoravni(pot) vrne število vodoravnih premikov sesalca. Sesalec se vedno premakne bodisi vodoravno bodisi navpično.
  7. desno(pot) vrne število premikov na desno.

Dodatna naloga

  1. na_poljih(pot) vrne slovar, katerega ključi so obiskana polja, vrednosti pa povedo, kolikokrat je bilo dotično polje obiskano.
  2. 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

  • testi.py testi.py
    17. marec 2026, 20:00
Trenutno uporabljate gostujoči dostop (Prijavite se)
Pridobi mobilno aplikacijo
Stran poganja Moodle
Obvestilo o avtorskih pravicah