Rešitve

Vsak po enkrat

Niz pretvorimo v množico. Ta bo imela vsak znak samo po enkrat. Če je velikost množice enaka dolžini niza, je imel tudi niz vsak znak samo po enkrat.

def samo_enkrat(s): return len(set(s)) == len(s)

Kot vedno pa obstajajo tudi daljše rešitve. Lahko gremo prek niza in za vsako črko preverimo, ali se je že pojavila: če se i-ta črka že pojavi med prvimi i-timi, se očitno pojavi (vsaj) dvakrat.

def samo_enkrat(s): for i, c in enumerate(s): if c in s[:i]: return False return True

Variant tega je še polno, recimo

def samo_enkrat(s): for c in s: if s.count(c) > 1: return False return True

Veliko, a ne več kot

Kot je namigoval namig, gremo prek vseh možnih koncev (for j in range(len(s) + 1)) in znotraj tega prek vseh možnih začetkov (for u in range(j)). Če je vsota v podseznamu s[i:j] dovolj majhna in hkrati večja od vseh doslejšnjih dovolj majhnih, si zapomnimo vsoto, začetek in konec. Na koncu vrnemo najboljše, kar smo našli.

def naj_pod(s, n): naj = naj_i = naj_j = 0 for j in range(len(s) + 1): for i in range(j): vs = sum(s[i:j]) if naj < vs <= n: naj, naj_i, naj_j = vs, i, j return s[naj_i:naj_j]

Palindrom

Rekurzija postaja dolgočasna.

def palindrom(s): return len(s) < 2 or s[0] == s[-1] and palindrom(s[1:-1])

Slepa polja

Gremo čez vsa polja. Za vsako polje pogledamo polja, v katera je mogoče priti. Če ta polja ne nastopajo v slovarju, so slepa in jih dodamo v množico slepih polj.

def slepa_polja(s): slepa = set() for kam in s.values(): for t in kam: if t not in s: slepa.add(t) return slepa

Skupni prijatelji

Gremo čez vse ljudi (b), preverimo število skupnih prijateljev a in b. Če je večje od največjega doslej, si to zapomnimo. Edini zoprni detajl je, da a in b ne smeta biti ena in ista oseba.

def naj_podobnik(self, a): naj_prij = -1 for b in self.graf: prij = len(self.skupni_prijatelji(a, b)) if a != b and prij > naj_prij: naj_prij, naj_b = prij, b return naj_b
Zadnja sprememba: ponedeljek, 24. junij 2013, 15.25