Marsovci v vrsto
- Domača naloga je nadaljevanje prejšnje.
- Ker smo se ta teden učili o izpeljanih seznamih, množicah in slovarjih ter generatorjih, je pri reševanju potrebno uporabljati le-te. Da boste to res počeli, morajo biti vse funkcije dolge eno samo vrstico - en sam
return
. Testi bodo to preverjali. Da si ne bi pomagali z dodatnimi funkcijami, ki bodo v resnici opravile vse delo, je tokrat prepovedano pisanje funkcij, ki jih naloga ne zahteva. - Naloga je sestavljena tako, da je mogoče vse funkcije napisati v eni vrstici - z izpeljenim seznamom, slovarjem ali množico - brez večjega truda, vendar le, če programirate pametno in zgledno. Zato: pomagajte si z objavljenimi rešitvami prejšnje naloge. (S tem vas tudi prisilim, da jih preberete in razumete. :)) Vaša tokratna naloga je v bistvu predelati prejšnje rešitve iz "imperativne" oblike v "deklarativno".
- Naloga se začne z nekaj ogrevalnimi funkcijami, ki niso povezane z glavnim delom naloge in vam pri njem ne bodo prišle prav.
- Miklavž je letos nekam zgoden. Preden začnete reševati, poskrolajte do konca, kjer vas čaka nekaj daril.
Obvezno ogrevanje
Napiši naslednje funkcije (vse prejmejo neprazen seznam krogov, opisanih s trojko (x, y, r); funkcija veliki poleg tega prejme še nek polmer);
polmeri(krogi)
vrne množico, ki vsebuje vse različne polmere krogov iz seznama,veliki(r0, krogi)
vrne množico koordinat krogov, katerih polmer je enak ali večji odr0
,obsegi(krogi)
vrne vsoto obsegov krogov,najlevo(krogi)
vrne koordinato x najbolj levo točko, ki se je dotikajo krogi (namig: od koordinate središča je potrebno odšteti polmer!),povrsina(krogi)
vrne površino pravokotnika, ki se razteza med najbolj levo in najbolj desno ter najbolj zgornjo in najbolj spodnjo točko, ki jo pokrivajo krogi. Z drugimi besedami, če bi morali kroge pokriti s pravokotnikom, ki bi ga postavili vzporedno z osmi (torej: brez vrtenja) - kako velik bi bilo?
Obvezna naloga
Napiši naslednje funkcije:
ocisti_slovar(d)
prejme nek slovard
in vrne nov slovar, ki vsebuje samo tiste pare (ključ, vrednost), pri katerih je vrednost resnična. "Neresnične" vrednosti soFalse
,0
in0.0
ter prazen seznam, množica, niz ali terka.znotraj(x0, y0, r0, krogi)
vrne seznam tistih krogov iz seznamakrogi
, ki se nahajajo znotraj kroga s središčem(x0, y0)
in polmeromr0
. (Krog mora biti strogo znotraj - ni dovolj, da sovpada. Krog(0, 0, 5)
ne leži znotraj kroga(0, 0, 5)
.)vsebovanost(krogi)
vrne slovar, katerega ključi so krogi, vrednosti pa so seznami krogov, ki so znotraj teh krogov, ki jih opisuje ključ. Če kak krog ne vsebuje nobenega drugega kroga, naj se tudi med ključi ne pojavi; z drugimi besedami, med vrednostmi naj ne bo nobenega praznega seznama. (Pomemben namig: uporabljaj funkcije, ki jih že imaš!)notranjost(krogi)
vrne množico vseh krogov, ki so znotraj katerega izmed drugih krogov.ptici0(vsebovani, notranji)
prejme slovar, kakršnega vrača funkcijavsebovanost
in množico, kakršno vračanotranjost
. Vrniti mora množico vseh ptičev.ptici(krogi)
prejme kroge in vrne ptiče.
Dodatna naloga
Napiši še
letala0(vsebovani, notranji)
letala(krogi)
sumljivi0(krogi, vsebovani, notranji)
(pazi: ta dobi tudikrogi
!)sumljivi(krogi)
ki so ekvivalentne funkcijam ptici0
in ptici
, le da vračajo letala in sumljive leteče predmete.
Miklavževa darila
Sveti Miklavž se je naveličal sajastih dimnikov in razmišlja o zamenjavi službe, zato se letos uči programirati, ker bo to izgledalo dobro v CV-ju. Ker ne more iz svoje dobrohotne kože, pa vam podarja nekaj funkcij. Lahko jih uporabite; glede na to, da gre za Miklavževa darila, tega ne bomo šteli za prepisovanje.
Objavljam jih skupaj s komentarji otrok, mislim, študentov.
# Hvala, Miklavž, čeprav bi tole znali napisati tudi sami.
# Obljubimo, da se jo bomo potrudili razumeti
# v
def ocisti_slovar(d):
return {k: v for k, v in d.items() if v}
# U, tale je pa kar zaresna. V ponedeljek bomo prosili profesorja,
# da nam jo razloži, ker smo radovedni kako deluje.
# v
def notranjost(krogi):
return set().union(*map(set, vsebovanost(krogi).values()))
# Eh, to bi pa res znali sami. Bomo še ostale naredili podobno.
def ptici(krogi):
return ptici0(vsebovanost(krogi), notranjost(krogi))
- The homework is a continuation of the previous homework.
- We talked about list, set and dictionary comprehensions, and generators, thus you must use them in your solutions. To check that you're actually doing so, all function must written as a single expression, a single
return
. Tests will check for this. To ensure that you're not hiding the code to auxiliary functions, you are -- only for this week! -- not allowed to write additional functions not required by the task. - All functions can be easily written in a single expression, but only if you code wise and elegant. To this end, you can use the published solution of the previous homework. (With this I also force you to read and understand them, which is great. :)) Your task is basically to rewrite my imperative functions to declarative.
- The homework commences with some warm-up functions. They are not meant to be useful for the remainder of the homework.
- Santa Claus came early. Scroll down for a few gifts.
Mandatory warm-up
Write the following functions, which get a non-empty list of circles, described with a triplet (x, y, r)
;function veliki
also gets an argument with threshold radius);
polmeri(krogi)
returns a set of all distinct radii,veliki(r0, krogi)
returns a set of coordinates of circles with radius greater or equalr0
,obsegi(krogi)
returns the sum of circumferences of circles,najlevo(krogi)
returns x coordinate of the left-most point touched by any circle (hint: don't forget to subtract the radius),povrsina(krogi)
returns the minimal area of rectangle that would cover all circle; the sides of the rectangle are parallel to the x and y axes, not rotated.
Mandatory task
Write the followind functions:
ocisti_slovar(d)
gets a dictionaryd
and returns a new dictionary that contains only pairs (key: value), for which the value is true-ish. False-ish values areFalse
,0
,0.0
and empty list, set, string and tuple.znotraj(x0, y0, r0, krogi)
return a list of circles fromkrogi
, that are inside the circle with center at(x0, y0)
and radiusr0
. (The circle must be strictly withing -(0, 0, 5)
is not inside(0, 0, 5)
.)vsebovanost(krogi)
returns a dictionary whose keys are circles and values are lists of circles within that circle. Circles that do not contain any other circles shouldn't be among keys. (Hint: use the functions you already implemented!)notranjost(krogi)
returns a set of circles that are within some other circle.ptici0(vsebovani, notranji)
gets a dictionary like those returned byvsebovanost
, and a set like those returned bynotranjost
. It returns a set of birds.ptici(krogi)
gets circles and returns a set of birds.
Extra task
Write functions
letala0(vsebovani, notranji)
letala(krogi)
sumljivi0(krogi, vsebovani, notranji)
(note the additional argument!)sumljivi(krogi)
which are equivalent to ptici0
in ptici
, but for airplanes and NLPs.
Santa Claus
Santa Claus hates chimneys and plans a change of profession, so he learns programming because this would look great on his CV. But he can't help himself and has brought you some gifts in form of functions. You can use them -- that is, copy them. Since they're given by Santa, we won't consider this plagiarism.
Is post them together with comments from children, I mean, students.
# Thanks, Santa, though we could write this ourselves, too.
# We promise we'll carefully read and understand this function.
def ocisti_slovar(d):
return {k: v for k, v in d.items() if v}
# Huh, this one is serious. We'll ask the professor on Monday
# to explain it to us. We're so curious.
def notranjost(krogi):
return set().union(*map(set, vsebovanost(krogi).values()))
# This one we could write ourselves. We'll do the others
# the same way.
def ptici(krogi):
return ptici0(vsebovanost(krogi), notranjost(krogi))
Test
- 24 November 2021, 10:23 PM