Rešitev in razlaga
Izpit je bil sestavljen takole:
- Soda in liha: delo s seznami; spreminjanje seznama, podanega kot argument (imenski prostori...)
- Decimalno: rekurzija
- Ograje: seznami, množice, telovadba z zankami
- Tečaji: delo s slovarji in množicami, malo telovadbe s pogoji in zankami
- Blok: objektno programiranje, slovarji
Soda in liha
Pripravimo seznam lihih in seznam sodih števil. Nato gremo čeznju in jih
paroma zlagamo v novi seznam. Če pri tem uporabimo zip
, bo ta
sam odrezal odvečne elemente.
Dodatna težava v nalogi je bila, da moramo spremeniti podani seznam, ne
pa ustvariti novega. Seznamu torej ne bomo ničesar prirejali (v slogu
s = nekaj
), temveč ga bomo le spreminjali.
Naloga je nekoliko sitna. Diši po tem, da bi se jo moralo dati rešiti krajše, vendar je ta, krajša rešitev, grda. Vseeno jo objavimo, pa naj jo gledajo tisti, ki jim je takšna pornografija blizu.
Decimalno
Če je niz dolg 1, torej, če je enak "0" ali "1", ga le pretvorim v število, pa sem. Sicer pa pretvorim v dvojiški zapis vse razen zadnje števke, to pomnožim z 2 in prištejem zadnjo števko.
Zvitejši naredijo tole:
Za izziv pobirajmo števke od spredaj, ne od zadaj. Napišimo rešitev, brez komentarja.
Zdi se mi, da bi se to, zadnje, moralo dati narediti tudi lepše, vendar mi ne pride nič pametnega na misel. Če kdo ve, naj pove.
Ograje
Naloga Ograje je vaja iz uporabe seznamov in množic (ter malo zank
in pogojev). Poleg tega je, upam, pokazala, da se splača slediti objavljenim
rešitvam domačih nalog. Je namreč silno funkciji ni_sosednjih
, ki
jo je bilo potrebno narediti pri domači nalogi
Pike (tam je predstavljala sicer
delček naloge za oceno 10 - vendar le preprostejši delček). Namig je namreč
predlagal, da od vseh možnih ograj odštejemo tiste med polji z isto črko.
Kdor je bral rešitve domačih nalog in se je spomnil na to nalogo, je lahko
rešitev praktično prepisal, le da tam preverjamo, ali obstajajo sosedi z isto
številko (no, v našem primeru črko), tule pa ne preverjamo obstoja temveč
štejemo.
Razčistimo še, koliko bi bilo ograj, če bi imela vsa polja različne lastnike. Če je polje dimenzije m*n, potrebujem (n+1)*m navpičnih ograj in (m+1)*n vodoravnih, torej skupaj (n+1)*m + (m+1)*n. Lahko pa obrnemo drugače in vsakemu polju postavimo levo in zgornjo ograjo; teh je 2*m*n, poleg tega pa spodnjim poljem še spodnjo in desnim še desno, zato 2*m*n + m + n. Oboje je isto.
Če vemo, da je True
isto kot 1 in False
isto kot
0, se rešitev še nekoliko poenostavi.
To vodi v rešitev, ki le prešteje, kar je treba.
Tečaji
Tole je vaja iz dela s slovarji in množicami.
Čim razumemo, kaj naj bi bilo v slovarju (in če smo že kdaj uporabljali
slovarje s privzetimi vrednostmi), je opravil
trivialna:
le tečaj doda v ustrezno množico.
najbolj_ucen
ponavlja ničkolikokrat izvedeni dril: iskanje največjega
elementa. Gornja rešitev je še nekako v dosegu tega, kar smo počeli pri
Programiranju 1 (čeprav uporabe argumenta key
pri funkciji
max
res nismo posebej kazali. Kdor ne zna tako, pa je še vedn
lahko naredil tako, kot smo sto in enkrat naredili na predavanjih, vajah in
v domačih nalogah. Recimo tako:
Funkcija vsi_tecaji
le zloži v isto množico vse vrednosti.
Neopravljeni tečaji pa so vsi, razen opravljenih.
V praksi bi resen programer te funkcije napisal takole:
Blok
Ko se enkrat odločimo, kaj bomo shranjevali v razredu Blok
, so
vse metode le začetniške vaje iz slovarjev. Metoda stanovalec
bo
morala vračati imena stanovalcev v določeni hiši, torej bo očitno
potrebno shranjevati imena ljudi v slovarju, katerega ključi so hiše.
V konstruktorju smo uporabili droben trik: slovar, katerega kljui so elementi
seznama hise
, vrednosti pa None
, smo sestavili z
dict.fromkeys(hise)
. Če tega ne poznamo (in večina tega najbrž ne
pozna), potrebujemo
ali, če imamo fobijo pred izpeljanimi seznami
Vse skupaj
Celotna rešitev izpita, kot bi jo pričakovali od poprečnega študenta, ki se ni pretirano poglobil v izpeljane sezname in podobne trike, zna pa solidno programirati, je takšna.