Marsovci v vrsto

Rok za oddajo: sreda, 1. december 2021, 15.00
  • 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 od r0,
  • 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 slovar d in vrne nov slovar, ki vsebuje samo tiste pare (ključ, vrednost), pri katerih je vrednost resnična. "Neresnične" vrednosti so False, 0 in 0.0 ter prazen seznam, množica, niz ali terka.
  • znotraj(x0, y0, r0, krogi) vrne seznam tistih krogov iz seznama krogi, ki se nahajajo znotraj kroga s središčem (x0, y0) in polmerom r0. (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 funkcija vsebovanost in množico, kakršno vrača notranjost. 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 tudi krogi!)
  • 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 equal r0,
  • 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 dictionary d and returns a new dictionary that contains only pairs (key: value), for which the value is true-ish. False-ish values are False, 0, 0.0 and empty list, set, string and tuple.
  • znotraj(x0, y0, r0, krogi) return a list of circles from krogi, that are inside the circle with center at (x0, y0) and radius r0. (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 by vsebovanost, and a set like those returned by notranjost. 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