ještě snad už poslední oprava.
def table(k, ruler):
rows = [[False] * ruler[0] + [True] * (k - ruler[0])]
for item in ruler[1:]:
newrow = [False] * k
for j in range(k):
if j - item >= 0 and rows[-1][j - item]:
newrow[j] = True
if j + item < k and rows[-1][j + item]:
newrow[j] = True
rows.append(newrow)
return rows
def bactrace(table, ruler):
last = table[-1].index(True)
res = []
for i, item in reversed(list(enumerate(ruler))[1:]):
if last - item >= 0 and table[i - 1][last - item]:
last = last - item
res.append((item, '+'))
else:
last = last + item
res.append((item, '-'))
res.append((ruler[0], '+'))
return list(reversed(res))
def find_folding(ruler):
maxlen = max(ruler)
for k in range(maxlen, maxlen*2 + 1):
t = table(k, ruler)
if any(t[-1]):
bt = bactrace(t, ruler)
return k - 1, bt
def format_folding(res):
return ' '.join(['%s %s ' % (sign, item) for item, sign in res[1]])
if __name__ == '__main__':
ruler = [3, 5, 2, 6]
print format_folding(find_folding(ruler))