Zemljevid ovir
Oddelek za gospodarske dejavnosti in (motorni) promet Mestne občine Ljubljana (MOL) slovi po srce parajoči skrbi za varnost kolesarjev. V imenu te skrbi jim povsod, kjer je to v interesu kolesarjev, odvzame prednost, jim postavlja različne ovire, viša robnike in ukinja kolesarske steze, kjer niso potrebne (predvsem, če je tam slučajno potrebno povečati število parkirišč za avtomobile). Vašemu profesorju se od ganjene hvaležnosti MOLu vsak dan orosi oko ob pogledu na mesto na Večni poti, kjer so - kot je povedal MOL - kolesarjem odvzeli prednost, da jih ne bi povozil avto ali kombi, ki morda ne bi vedel, da imajo tu prednost kolesarji. (Več o tem si preberite na strani Runda.)
Naloga
Recimo, da so ovire postavljene, kot kaže slika. V Pythonu bi lahko njihove pozicije opisali s seznamom trojk (terk) (x1, x2, y), kjer sta x1 in x2 (x1 <= x2) številki stolpca, kjer se ovira začne in konča (ovira vključuje tudi x2!). Ovire na sliki bi tako opisali s seznamom
ovire = [(1, 3, 6), (2, 4, 3), (4, 6, 7),
(3, 4, 9), (6, 9, 5), (9, 10, 2),
(9, 10, 8)]
Vrstni red elementov seznama je nepomemben.
Napiši naslednje funkcije
dolzina_ovire(ovira)prejme oviro v obliki terke(x0, x1, y)in vrne njeno dolžino. Klicdolzina_ovire((4, 7, 13))vrne4. (Pazi: funkcija ne prejme treh argumentov temveč en argument, namreč terko s tremi elementi.)najdaljsa_ovira(ovire)prejme seznam ovir in vrne najdaljšo oviro. Če je najdaljših ovir več, vrne tisto, ki se v seznamu pojavi prej.dimenzije(ovire)vrne širino in dolžino kolesarke steze, največjo vrednostx2in največjo vrednosty, ki se pojavi med trojkami v seznamu. Za primer na sliki vrne(10, 9).globina(ovire, x)vrne številko vrstice, v kateri bi kolesar, ki se vozi po podanem stolpcuxod zgoraj navzdol, naletel na oviro. Če v stolpcu ni ovir, naj vrne številko, ki je za 1 večja od zadnje vrstice z oviro. Za primer na sliki bi za stolpec brez ovir (če bi na sliki obstajal, seveda) vrnil10, saj je zadnja ovira v vrstici9.naj_stolpec(ovire)vrne številko stolpca, v katerem kolesar pride najdlje. Če je takšnih stolpcev več, vrne prvega med njimi.senca(ovire)vrne seznam, katerega elementa soFalseoz.Trueglede na to, ali stolpec vsebuje kako oviro ali ne. Če je širina poti5in sta drugi in zadnji stolpec brez ovir (to ni primer s slike), vrne[False, True, False, False, True].
Izziv
Vse funkcije, razen globina in sence, že skoraj znate napisati v eni vrstici. :) (Nekoč pa se bomo naučili tudi tidve; ni zapleteno, vendar pač še ne znamo.)
Neobvezni, dodatni izziv za tiste, ki se vas da izzvati, je, da poskusite. Nekaj je preprostih, nekaj pa jih zahteva malo razmisleka - in malo pomoči glede dveh funkcij, ki ju še nismo videli.
dolzina_ovire: tega se itak ne da napisati daljše kot v eni vrstici.najdaljsa_ovira: to znamo in razočaran bom, če kdo tega ne bo naredil v eni vrstici. :) Spomnite se predavanj.dimenzije: No, tale je izziv za razmišljanje. Uporabite lahko funkcijoitemgetter, ki jo najdete v moduluoperator.itemgetterje funkcija, ki ji podamo indeks, in vrne funkcijo, ki ji podamo seznam in vrača element seznama s tem indeksom. Ta stavek po potrebi preberite še enkrat. :) Ali pa poglejte spodnji primer.>>> from operator import itemgetter >>> >>> drugi = itemgetter(2) >>> >>> s = (5, 7, 2, 6, 1) >>> t = ["Ana", "Berta", "Cilka", "Dani", "Ema"] >>> u = "Benjamin" >>> >>> drugi(s) 2 >>> drugi(t) 'Cilka' >>> drugi(u) 'n'itemgetter(2)je vrnil funkcijo, ki smo jo poimenovalidrugi.drugije torej funkcija, ki vrne drugi element ... česarkoli, kar jih podamo kot argument.naj_stolpec: tale je še malo zanimivejši izziv. Najprej: funkcija vrača število med 1 in širino. Torej iščemomaxod teh števil, vendar po primernem ključu. Kaj pa bo ključ? Funkcijo za to očitno imamo, vendar zahteva tudi argumentovire. Tu privlečemo iz rokava novo zanimivo funkcijo:partializ modulafunctools. Tej podamo funkcijo in enega ali več argumentov, pa nam vrne novo funkcijo, ki je enaka oni, podani, vendar je prvi (oz. nekaj prvih) argumentov fiksiranih.>>> from functools import partial >>> >>> z_dani = partial(f, "Dani") >>> >>> def f(prvi, drugi, tretji): ... print(prvi, "in", drugi, ", poleg njiju pa tudi", tretji) ... >>> f("Ana", "Berta", "Cilka") Ana in Berta , poleg njju pa tudi Cilka >>> >>> z_dani("Berta", "Cilka") Dani in Berta , poleg njiju pa tudi Cilka >>> z_dani("Ema", "Greta") Dani in Ema , poleg njiju pa tudi GretaFunkcija
z_danije enaka funkcijif, le da je prvi argument že nastavljen na"Dani".
Testi
- 20 februar 2024, 21:14