Essa foi a solução que eu encontrei. Testei apenas para os valores informados e não está muito bem escrito. Porém, espero que possa ajudar a entender como encontrar a sua solução.
Obs.: eu acho que o problema da sua solução é que você não sabe quantos blocos vai na primeira coluna, caso soubesse era, de fato, ir somando 1 à cada coluna. Além disso, se encontrar algum erro na minha solução seria ótimo saber.
def minBlocks(columns):
min_blocks = 0
for i in range(columns):
min_blocks += i + 1
return min_blocks
def buildStair(columns: int, block_list: list):
min_blocks = minBlocks(columns)
block_count = sum(block_list)
blocksLeft = block_count - min_blocks
if block_count < min_blocks or not (blocksLeft % columns == 0):
print("Impossível montar escada")
return
stair = []
for i in range(columns):
if (i == 0):
stair.append(1)
else:
stair.append(stair[i-1] + 1)
leftForEachColumn = blocksLeft // columns
stair = list(map(lambda x: x + leftForEachColumn, stair))
return stair
def movedBlocks(block_list: list, stair: list):
movedBlocks = 0
columns = len(stair)
for column in range(columns):
movedBlocks += abs(block_list[column] - stair[column])
return movedBlocks // 2
blockList = [5, 4, 5, 4, 2]
stair = buildStair(5, blockList)
print(stair)
if stair:
print(movedBlocks(blockList, stair))
blockList = [9, 8, 7, 6, 5, 4]
stair = buildStair(6, blockList)
print(stair)
if stair:
print(movedBlocks(blockList, stair))
blockList = [1, 5]
stair = buildStair(2, blockList)
print(stair)
if stair:
print(movedBlocks(blockList, stair))