◂ 15 décembre 2015 ▸
Science for Hungry People :
- code.py
- codeRepartitionNonRecursif.py
- codeRepartitionOneLiner.py
- maths.py
# plus rapide de seulement 10%
def repartitions(nb_billes, nb_godets):
if nb_billes < 0 or nb_godets < 0:
raise ValueError('values must be non negative')
if nb_godets == 0:
if nb_billes == 0:
yield []
return
else:
return
repart = (nb_godets-1) * [0] + [nb_billes]
while (repart):
yield repart
repart = nextRepart(repart)
def nextRepart(t):
if len(t) == 0:
return None
if t[0] > 0:
for i in range(1, len(t)):
if t[i] > 0:
t = t[:]
n = t[0]
t[i] -= 1
t[i-1] += 1 + n
t[0] -= n
return t
return None # t est le dernier de la liste
else:
for i in range(1, len(t)):
if t[i] > 0:
t = t[:]
t[i] -= 1
t[i-1] += 1
return t
return None # t vide
print(list(repartitions(5,3)))