Krogi

Prva naloga je bila sestavljena iz dveh drobnih funkcij in ene "prave". Čeprav sta bili tidve toliko manjši, sem dajal zanju po deset točk, prava pa je bila vredna 15. (Opravičujem se, ker tega nisem povedal vnaprej; sicer pa je bilo to vsem v korist, saj ste mnogi napisali prvi, pomožni funkciji, zaresne pa ne.)

Prva funkcija je popolnoma preprosta, le en izraz.

def se_sekata(x1, y1, r1, x2, y2, r2): return (x1 - x2) ** 2 + (y1 - y2) ** 2 <= (r1 + r2) ** 2

Tale izraz namesto razdalj primerja njihove kvadrate. Nič nisem zameril, če ste primerjali korene.

def se_sekata(x1, y1, r1, x2, y2, r2): return sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) <= r1 + r2 Navidez je koren enako dober, obenem pa preglednejši. "Pravi računalnikarji" vedo, da ima računalnik s korenom več dela. Tudi pri matematiki bi bilo preprosteje primerjati kvadrate, ki jih lahko računamo na pamet, kot korene, ki jih ne moremo.

Veselilo me je, če niste pisali odvečnih oklepajev. Mnogi pa ste jih naredili okrog desne strani, pa še okrog izrazov na levi; nekateri ste jih dodali še okrog celotnega izraza. Tako dobimo

def se_sekata(x1, y1, r1, x2, y2, r2): return (sqrt(((x1 - x2) ** 2) + ((y1 - y2) ** 2)) <= (r1 + r2))

Tole je precej nepregledno in tudi malo nevarno, vendar naj bo. Pač pa sem odbil točko vsakemu, ki se ni naučil, da je rezultat primerjanja že True ali False in je pisal funkcije, kot je

def se_sekata(x1, y1, r1, x2, y2, r2): if sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) <= r1 + r2: return True else: return False

V zvezi s to funkcijo sem dolžan ponižno opravičilo za slaba navodila: izvirno je naloga govorila o krogih, potem sem to spremenil v krožnice, a pozabil na primer, ko je krožnica v celoti znotraj druge krožnice. Kot pravilni sem seveda štel obe razumevanji.

Naslednja funkcija je zahtevala, da znate zapisati stari zguljeni if znotraj for.

def seka_koga(x, y, r, s): for x0, y0, r0 in s: if se_sekata(x, y, r, x0, y0, r0): return True return False

Obenem je naloga preverjala, ali znate uporabiti lastno funkcijo znotraj naslednje funkcije. Tistim, ki tega niso počeli, sicer nisem odbijal točk. Če so se zaradi tega zmotili, so si krivi sami.

Naslednja funkcija je povzročala še največ težav na izpitu. Zahtevala je nekaj telovadbe s seznami.

def krogi(s): ploscina = 0 dosedanji = [] for x, y, r in s: if not seka_koga(x, y, r, dosedanji): dosedanji.append((x, y, r)) ploscina += pi * r ** 2 return len(dosedanji), ploscina Gremo čez seznam krogov. Vse, ki ne sekajo nobenega od dosedanjih, dodamo v seznam dosedanjih in k skupni ploščini prištejemo njegovo ploščino. Ostale meni nič, tebi nič ignoriramo. Na koncu vrnemo dolžino seznama krogov, ki smo jih nabrali, in njihovo skupno ploščino.

Rekurzija

Naloga iz rekurzije je bila "lažjega tipa", takšna, v kateri le pretvorite logični izraz v Python.

def narascajoci(s): return len(s) < 2 or s[0] < s[1] and narascajoci(s[1:])

Tudi tu sem odbijal točke tistim, ki so plesali s kakšnimi True in False.

Sociogram

Prvi del je nekakšno preobračanja slovarja tako, da ključi postanejo vrednosti in obratno. Nekaj podobnega smo že počeli.

Tule je bilo potrebno z vse pare (kdo, prijatelji), pogledati, ali je ciljna oseba med prijatelji in v tem primeru dodati med prijatelje te osebe še "kdo". Uf, slovenščina je okorna, v Pythonu se to razloži lepše:

def prijatelji(komu, mreza): s = set() for kdo, koga in mreza.items(): if komu in koga: s.add(kdo) return s

Nadaljevanje je spet nekaj, kar smo utrjevali ves semester: funkcija, ki išče največji element in vrne nekaj, kar pripada temu elementu. Rešitev je čisto klasična.

def najbolj_priljubljen(mreza): kdo = None koliko = 0 for k in mreza: kk = len(prijatelji(k, mreza)) if kk > koliko: koliko = kk kdo = k return kdo

Problem: nekateri niste klicali funkcije prijatelji, temveč ste ponavljali njeno kodo znotraj najbolj_priljubljene. V tem primeru se vaše življenje seveda zaplete.

Krog - razred

Tule ste morali pokazati samo, da znate zložiti metode v razred. S tem večinoma niste imeli težav.

class Krog: def __init__(self, x, y, r): self.x = x self.y = y self.r = r def ploscina(self): return pi * self.r ** 2 def seka(self, drugi): return (self.x - drugi.x) ** 2 + (self.y - drugi.y) ** 2 <= (self.r + drugi.r) ** 2

Tule nisem klical funkcije, ki smo jo napisali v prvi nalogi, da je vsa rešitev znotraj naloge. Če ste to počeli, seveda ni bilo nič narobe.

Zadnja sprememba: sreda, 11. junij 2014, 16.17