Rešitve in razlaga
Izpit je bil sestavljen takole:
- Najprej lihi: delo s seznami; spreminjanje seznama, podanega kot argument (imenski prostori...)
- Binarno: rekurzija
- Dopisovalci: delo s slovarji in množicami, malo telovadbe s pogoji in zankami
- Zaporniki: seznami, množice, telovadba z zankami
- Blok: objektno programiranje, seznami, zanke
Najprej lihi
Najprej dolgočasna rešitev. Pripravimo dva seznama, enega za lihe, drugega za sode. Gremo čez podani seznam in mečemo liha števila v enega, soda v drugega. Nato zamenjamo vsebino podanega seznama z vsoto prvega in drugega.
Da se ne bo kdo pritoževal, da je naloga dolgočasna in, predvsem, neduhovita,
se znebimo if
-a. Oba seznama mimogrede postavimo v nov seznam in
append
-ajmo bodisi v enega bodisi v drugega.
Zdaj je [sodi, lihi][e % 2]
isto kot sodi
, če je
e % 2
enako 0, in isto kot lihi
, če je
e % 2
enako 1.
Namesto da bi sodi
in lihi
vsakič znova tlačili
v seznam (ki smo ga naredili le zato, da smo se znebili if
-a),
lahko kar ves čas delamo s skupnim seznamom.
Zdaj pa lepše rešitve. Če poznamo izpeljane sezname, brez težav sestavimo seznam lihih in seznam sodih števil ter ju seštejemo. V enem zamahu.
Zmagovalno rešitev pa je prispeval asistent Možina. Seznam
s
preprosto uredimo po ostanku po deljenju z 2.
Ali, enako lepo,
Zakaj ne bi naloge rešili še rekurzivno?
Funkcija najprej_lihi
bo težko rekurzivna, saj ne vrača
ničesar, temveč spreminja vrednosti argumentov. Tudi takšne funkcije so lahko
in pogosto so rekurzivne, ampak tule ... nekako ni prikladno. Pač pa pokiče
rekurzivno funkcijo izberi
, ki ji podamo seznam in z drugim
argumentom, o
, povemo, ali hočemo tiste, pri katerih je ostanek
po daljenju z 2 lih ali sod.
Funkcija izberi kar kliče po tem, da jo zapišemo krajše.
Binarno
Če je število enako 0 ali 1, vrnemo to število, pretvorjeno v niz. Sicer pa število delimo z 2 in ga spremenimo v dvojiško, na konec pa pripnemo zadnjo števko - dobimo jo kot ostanek po deljenju števila z 2.
Kdor rad svinja, naredi tako.
Dopisovalci
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 dopis
trivialna:
le dopisovalca doda.
Najzgovornejši 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 vse_osebe
le zloži v isto množico vse ključe in vse
vrednosti. Ključe lahko dobi kar s set(relacije)
, za množice
se mora sprehoditi prek vrednosti.
Neznanci pa so vsi, razen tistih, ki jim je dotični pisal in dotičnega samega.
V praksi bi resen programer te funkcije napisal takole:
Sogovorniki
Naloga sogovorniki 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). 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 s skupnim jezikom), tule pa ne preverjamo obstoja temveč štejemo.
Kako ugotovimo, ali dva soseda govorita kak skupni jezik, pa je namignila naloga: presek množic jezikov mora biti neprazen.
Če vemo, da je True
isto kot 1 in False
isto kot
0; če vemo, da se logičnim vrednostim reče bool
; če vemo, da
objekte tipa str
, int
, float
,
list
, Potnik
dobimo tako, da pokličemo funkcije
(tipe, konstruktorje - imenujte jih kakor jih hočete)
str
, int
, float
,
list
, Potnik
, se rešitev še nekoliko poenostavi.
To vodi v rešitev, ki le prešteje, kar je treba.
Ali pa sestavimo vse komunicirajoče pare in jih preštejemo.
Blok
Ko se enkrat odločimo, kaj bomo shranjevali v razredu Blok
, so
vse metode le začetniške vaje iz seznamov. Metoda stanovalec
bo
morala vračati imena stanovalcev v določenem nadstropju, torej bo očitno
potrebno shranjevati imena ljudi po nadstropjih. Nadstropja so oštevilčena od 0
naprej, torej bo primeren kar navaden seznam.
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.