Rešitve in razlaga
Teme
Naloge so pokrivale enake teme kot navadno:
- Ravnotežje: malo telovadbe z zankami in slovarji, klasičen vzorec (iskanje elementa, pri katerem je vrednost določene lastnosti maksimalna...)
- k_ti: delo s slovarji in seznami, predvsem pa še malo telovadbe
- Koliko brez otrok: rekurzija, očitno
- Osnovnošolski ples: razumevanje slovarjev in množic, brez pretiranega programiranja
- Mobilni operater: objektno programiranje (razumevanje atributov, definicija metod...), brez pretiranega programiranja
Ravnotežje
Razliko med težo seznama do i-tega elementa in od i-tega naprej izračunamo
takole: sum(s[:i]) - sum(s[i:])
. Ker hočemo, da je razlika čim
manjša, bomo opazovali absolutno vrednost te razlike, torej
abs(sum(s[:i]) - sum(s[i:]))
.
Zdaj se zapeljemo z i
od začetka do konca in si zapomnimo, pri
katerem i
je bila razlika najmanjša.
Kot začetno vrednost najboljšega i
in najmanjše razlike vzamemo
kar naj_i = 0
, pripadajoča razlika pa je seveda
naj_r = sum(s)
(vsi elementi so na isti strani). Namesto tega bi
lahko naredili tudi kako drugače - na kakega od načinov, ki smo jih za podobne
naloge (tole smo reševali velikokrat...) uporabljali doslej.
Pri reševanju naloge ste se mnogi izgubili pri računanju vsot.
K-ti
Nalogo najprej rešimo na okornejši, daljši način. Najprej bomo prešteli
pogostosti posameznih črk. Za to bomo uporabili slovarje s privzetimi
vrednostmi. Ta slovar bi si potem želeli urediti po pogostosti črk, vendar se
slovarjev ne da urejati. Zato prepišemo slovar v seznam parov, pri čemer je
prvi element para pogostost, drugi črka. Ta slovar uredimo padajoče in vrnemo
k-ti element. (Če ne bi znali urejati nepadajoče, bi vrnili k-tega z zadnjega
konca, torej element z indeksom -1 - k
.) Celoten program po tej,
bolj zapleteni različici, je takšen.
Krajši program je na koncu te strani.
Mnogi ste se pri tej nalogi zaplezali in izgubljali čas z običajnimi slovarji. S tem ne bi bilo nič narobe - če ne postane program zaradi tega tako zapleten, da se izgubite v njem.
Brez otrok
Naloga je podobna drugim rodbinskim nalogam. Tokrat gre tako: Če neka oseba nima otrok, je v njeni rodbini natančno ena oseba brez otrok, namreč ona. Sicer pa gre prek otrok in vsakega vpraša, koliko je v njegovi rodbini takšnih, ki nimajo otrok, ter sešteje odgovore.
Krajša verzija - na koncu besedila.
Kandidati
Spet bomo uporabili slovar s privzetimi vrednostmi. Vrednosti bodo množice. Gremo čez slovar, v katerem so fantje izbirali punce in v novi slovar dodajemo ravno obratno - k puncam dodajamo fante. To je vse. ;)
Naročniki
Naloga je zahtevala, da razumete, da v self.klici
shranjujemo
neke informacije o klicih, ki jih potem uporabljamo v metodah.
Glede na to, da se vse metode, ki jih pišemo, sprašujejo le o dolžinah
klicev, ne bo nič narobe, če v self.klici
shranjujemo le
dolžine. Rešitev je tedaj kar takšna:
Rešitev, ki shranjuje začetke in konce, pa je spodaj.
Krajše rešitve
"Funkcijska" rešitev zadnje naloge
Tule je še ena malo drugače zasukana rešitev zadnje naloge. Zanimiva je, ker boste nekaj več tega videli pri Programiranju 2.