Rešitve

Blagajna

Z zanko gremo čez niz in spremljamo dolžino vrste: vsakič, ko vidimo +, zabeležimo, da je vrsta za 1 daljša, sicer pa je za 1 krajša. Kadar se vrsta podaljša, še preverimo, ali je daljša od najdaljše doslej in si jo, če je tako zapomnimo. Na koncu vrnemo dolžino najdaljše vrste.

def blagajna(s): naj_vrsta = vrsta = 0 for c in s: if c == "+": vrsta += 1 if vrsta > naj_vrsta: naj_vrsta = vrsta else: vrsta -= 1 return naj_vrsta

Kockarji

Potrebovali bomo tabelico, v katero bomo šteli, kolikokrat je kdo vrgel šestico. V začetku bo vsebovala n ničel, nato bomo šli prek niza in vsakič, ko vidimo šestico, povečali vsebino ustreznega polja za 1. Katero pa je ustrezno polje? Preprosto, izračunamo ostanek po deljenju z n. Če imamo tri kockarje, se elementi 0, 3, 6, 9 nanašajo na ničtega, 1, 4, 7, 10 na prvega, 2, 5, 8, 11 na drugega.

Ko je tabelica sestavljena, poiščemo indeks elementa z največjo vrednostjo. Kot rezultat vrnemo številko povečano za 1, saj naloga pravi, da je prvi kockar kockar 1 in ne kockar 0.

def kockarji(s, n): sestic = [0] * n for i, m in enumerate(s): if m == 6: sestic[i % n] += 1 naj_s = 0 for i, s in enumerate(sestic): if s > naj_s: naj_i, naj_s = i, s return naj_i + 1

Enakost seznamov

Spomnimo se, da so prazni seznami neresnični, neprazni pa resnični. Funkcijo potem napišemo tako, da prevedemo opis naloge v Python.

def enaka(s, t): return not s and not t or s and t and s[0] == t[0] and enaka(s[1:], t[1:])

Gremo bolj počasi? Prav. Naloga pravi: Dva seznama sta enaka, če sta oba prazna ali pa sta oba neprazna in imata enaka prva elementa in sta enaka tudi ostanka seznama (vse razen prvega elementa).

sta oba prazna: not s and not t
sta oba neprazna: s and t
imata enaka prva elementa: s[0] == t[0]
sta enaka tudi ostanka seznama: enaka(s[1:], t[1:])

Tole je natančno tisto, kar smo napisali v return, samo še or in and postavimo vmes.

Lego

Sprehoditi se moramo čez slovar potrebnih reči. Da dobimo pare (stvar, količina) bomo uporabili metodo items() (šlo pa bi seveda tudi brez nje. Za vsako stvar pogledamo, ali je v škatli in ali je je dovolj. Če je ni ali če je ni dovolj, vrnemo False. Sicer pa pustimo zanko, da se izteče do konca in če se, na koncu vrnemo True.

def vsi_deli(skatla, potrebno): for stvar, kolicina in potrebno.items(): if stvar not in skatla or skatla[stvar] < potrebno[stvar]: return False return True

Slovar manjkajočih stvari naredimo na zelo podoben način: gremo čez vse potrebno. Če je nekaj v škatli, vendar v premajhni količini, zabeležimo, koliko te stvari še potrebujemo (toliko, kolikor je je potrebno minus toliko, kolikor je dobimo v škatli. Če pa nečesa ni v škatli, potrebujemo še vse.

def kaj_manjka(skatla, potrebno): manjka = {} for stvar, kolicina in potrebno.items(): if stvar in skatla: if skatla[stvar] < kolicina: manjka[stvar] = kolicina - skatla[stvar] else: manjka[stvar] = kolicina return manjka

Gre pa tudi krajše - če vemo, kaj počne metoda get.

def kaj_manjka(skatla, potrebno): manjka = {} for stvar, kolicina in potrebno.items(): potrebujemo = kolicina - skatla.get(stvar, 0) if potrebujemo > 0: manjka[stvar] = potrebujemo return manjka

Nalogo je seveda mogoče rešiti tudi tako, da najprej napišemo drugo funkcijo in jo kličemo iz prve:

def vsi_deli(skatla, potrebno): return not kaj_manjka(skatla, potrebno)

Lego - objektni

O tem, kako to spraviti v objekte, pa nimamo kaj dosti povedati. Konstruktor bo shranil vsebino škatle v self.vsebina. Funkciji iz prejšnje naloge spremenimo v metodi, argument skatla zamenjamo s self in znotraj funkcij gledamo self.vsebina.

class Skatla: def __init__(self, vsebina): self.vsebina = vsebina def kaj_manjka(self, potrebno): manjka = {} for stvar, kolicina in potrebno.items(): if stvar in self.vsebina: if self.vsebina[stvar] < kolicina: manjka[stvar] = kolicina - self.vsebina[stvar] else: manjka[stvar] = kolicina return manjka def vsi_deli(self, potrebno): return not self.kaj_manjka(potrebno)
Zadnja sprememba: torek, 11. junij 2013, 15.09