Advent of code

 15 décembre 2015 

  Science for Hungry People :
  1. code.py
  2. codeRepartitionNonRecursif.py
  3. codeRepartitionOneLiner.py
  4. 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)))