메인 콘텐츠로 건너뛰기
Učilnica FRI 25/26
  • 홈
  • 캘린더
  • 더 보기
한국어 ‎(ko)‎
English ‎(en)‎ Slovenščina ‎(sl)‎ Македонски ‎(mk)‎ Русский ‎(ru)‎ 한국어 ‎(ko)‎
손님 계정으로 접속
로그인
Učilnica FRI 25/26
홈 캘린더
모두 펼치기 모두 접기
  1. 강의 현황
  2. pef
  3. Generatorji ter izpeljani seznami, množice in slovarji
  4. Izvrstni sesalec

Izvrstni sesalec

완료 조건
Due: 화요일, 24 3월 2026, 9:40 AM

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 3월 2026, 8:00 PM
손님 계정으로 접속 (로그인)
Get the mobile app
Moodle 제공
Obvestilo o avtorskih pravicah