Vse naloge

Za občutek so tu najprej rešitve vseh nalog. Različice rešitev in komentarji so spodaj.

def sodi_vs_lihi(s): lihi = [e for e in s if e % 2 == 1] sodi = [e for e in s if e % 2 == 0] return lihi if len(lihi) > len(sodi) else sodi def hamilkon(obhod): if len(obhod) != 65 or len(set(obhod)) != 64 or obhod[0] != obhod[-1]: return False for i in range(64): p1, p2 = obhod[i], obhod[i+1] if {abs(ord(p1[0])-ord(p2[0])), abs(ord(p1[1])-ord(p2[1]))} != {1, 2}: return False return True def naslednji_avtobus(prihodi): kdaj = 1440 for avtobus, minute in prihodi.items(): stev = int(avtobus if avtobus[-1].isdigit() else avtobus[:-1]) minute = min(minute) if minute < kdaj or minute==kdaj and stev < najstev: kdaj, najstev, najavtobus = minute, stev, avtobus return najavtobus def cenzura(besedilo, prepovedane): return " ".join(beseda for beseda in besedilo.split() if beseda.lower() not in prepovedane) class two_way_dict(dict): def __getitem__(self, key): if key in self: return super(two_way_dict, self).__getitem__(key) for k, v in self.items(): if v == key: return k

Po nalogah

Naloga A

Potrebno je bilo spremeniti črke v števke in namesto ničtega jemati prvi element niza s pozicijo.

Naloga B

Na določeno strateško mesto v vaši funkciji ste morali dodati nekaj v slogu if ime[0] != "."

Sodi vs. lihi

Ne enkrat, trikrat jo rešimo!

Razvlečena klasika

Preštejemo, koliko je lihih. Sestavimo nov, prazen seznam. Če je lihih več kot pol, dodamo vanj vse lihe, sicer dodamo vanj vse sode.

def sodi_vs_lihi(s): lihih = 0 for e in s: lihih += e % 2 t = [] if lihih > len(s)/2: for e in s: if e % 2 == 1: t.append(e) else: for e in s: if e % 2 == 0: t.append(e) return t

Dva izpeljana seznama

Naredimo seznam lihih. Naredimo seznam sodih. Vrnemo lihe, če jih je več kot sodih, sicer pa sode.

def sodi_vs_lihi(s): lihi = [e for e in s if e % 2 == 1] sodi = [e for e in s if e % 2 == 0] return lihi if len(lihi) > len(sodi) else sodi

Bool kot int

Tega pa si razložite sami.

def sodi_vs_lihi(s): t = sum(e % 2 for e in s) > len(s) / 2 return [e for e in s if e % 2 == t]

Hamilkon

Obhod mora imeti 65 polj (len(obhod) == 65). Vsako polje se mora pojaviti samo enkrat, razen prvega in zadnjega; to preverimo tako, da iz seznama naredimo množico in ta mora imeti 64 elementov (len(set(obhod)) == 64). Prvo polje mora biti enako zadnjemu (obhod[0] == obhod[-1]). Če kaj od tega ni res, kar takoj vrnemo False.

Sicer preverimo vsak par zaporednih polj in, tako kot pri nalogi z napadalnimi kraljicami, izračunamo razliko koordinat. Pri kraljicah sta morali biti enaki, tu pa mora biti ena 1 in druga 2. Da se ne zafrkavamo s tem, katera je katera jih spravimo kar v množico in preverimo, ali je ta množica enaka {1, 2}.

def hamilkon(obhod): if len(obhod) != 65 or len(set(obhod)) != 64 or obhod[0] != obhod[-1]: return False for i in range(64): p1, p2 = obhod[i], obhod[i+1] if {abs(ord(p1[0])-ord(p2[0])), abs(ord(p1[1])-ord(p2[1]))} != {1, 2}: return False return True

Naslednji avtobus

Naloga je klasičen "poišči najmanjši element" z dodatnim trikom: kako primerjati številke avtobusov? Vsekakor jih bomo morali iz nizov pretvoriti v števila, da bo 2 manj kot 11. Po drugi strani pa se je potrebno znebiti odvečne črke na koncu. Takole naredimo: če je zadnji znak imena avtobusa števka, potem uporabimo celo ime, sicer vse znake do zadnjega: stev = int(avtobus if avtobus[-1].isdigit() else avtobus[:-1]). Odtod naprej je preprosto.

def naslednji_avtobus(prihodi): kdaj = 1440 for avtobus, minute in prihodi.items(): stev = int(avtobus if avtobus[-1].isdigit() else avtobus[:-1]) minute = min(minute) if minute < kdaj or minute==kdaj and stev < najstev: kdaj, najstev, najavtobus = minute, stev, avtobus return najavtobus

Cenzura

Razbijemo na besede, vzamemo tiste, ki niso prepovedane, združimo nazaj v niz.

def cenzura(besedilo, prepovedane): return " ".join(beseda for beseda in besedilo.split() if beseda.lower() not in prepovedane)

Dvosmerni slovar

Naloga je zelo blizu domači nalogi. Kdor je prebral komentarje rešitve, je ravnal pametno, saj je z nalogo zelo hitro opravil. Novi razred je izpeljal kar iz slovarja in "popravil" __getitem__. Novi __getitem__ preveri, ali v slovarju obstaja takšen ključ in v tem primeru kliče podedovani __getitem__. Sicer preišče slovar in če najde iskano vrednost, vrne ključ.

class two_way_dict(dict): def __getitem__(self, key): if key in self: return super(two_way_dict, self).__getitem__(key) for k, v in self.items(): if v == key: return k

Omenimo, da bi za dobro rešitev raje uporabljali dva slovarja, za izpit pa je tole seveda dovolj.

Zadnja sprememba: četrtek, 26. januar 2012, 14.13