table = [1, ]
TARGET = 60
target = TARGET - table[-1]

#pas plus de 2 fois le même bond
#D'où la régle de codage:
#- bond 1 est 'int'
#- bond 2 est 'float' et vaut 'int' + 0.01
#Par faciliter les recherches dans la liste de bonds
solution = list()

def hercule(table, target):
    global solution

    if target == 0:
        solution.append(table)
        return

    if target < 0:
        return

    previous = int(table[-1])

    #Choix 1 = même longueur que le précédent:
    if not previous+0.01 in table: #Pas la peine de chercher en 'int' car il y est forcément
        hercule(table.copy() + [previous+0.01, ], target-previous)
    
    #Choix 2 = bond de 2m plus court
    if previous > 1 and previous+0.01-2 not in table: #Pas la peine de chercher en 'int' car il y est forcément
        hercule(table.copy() + [previous+0.01-2, ], target-(previous-2))

    #Choix 3a = bond de 2m plus long (1er bond de cette longueur)
    if previous+2 not in table:
        hercule(table.copy() + [previous+2, ], target-(previous+2))

    #Choix 3b = bond de 2m plus long (2er bond de cette longueur)
    elif previous+0.01+2 not in table:
        hercule(table.copy() + [previous+0.01+2, ], target-(previous+2))

hercule(table, target)

#J'enlèvre les 0.01
for i in range(len(solution)):
    solution[i] = [int(x) for x in solution[i]]    

#Je transforme en offset à partir de 0
solution2 = list()
for s in solution:
    tmp = [0,]
    for i in s:
        tmp.append(tmp[-1]+i)
    solution2.append(tmp)
print(solution2)

from itertools import combinations

table = [i for i in range(20, 41)]
table3 = list(combinations(table, 4))
for i in table3:
    a = i[0]
    b = i[1]
    c = i[2]
    d = i[3]
    for s in solution2:
        if a not in s and b not in s and c not in s and d not in s:
            break
    else:
        print(a,b,c,d)

