from lib import get_data from copy import deepcopy data = get_data(__file__) i = 0 f = True d = [] spaces = 0 for c in data.strip(): if f: d.append([int(c), i, f]) f = False i += 1 else: spaces += int(c) d.append([int(c), -1, f]) f = True d2 = deepcopy(d) BLOCKS, ID, FULL = 0, 1, 2 empty_i = 1 full_i = len(d) - 1 assert d[full_i][FULL] while empty_i < full_i: empty = d[empty_i] full = d[full_i] if empty[BLOCKS] == full[BLOCKS]: empty[ID] = full[ID] empty[FULL] = True full[BLOCKS] = 0 full[FULL] = False elif empty[BLOCKS] < full[BLOCKS]: empty[ID] = full[ID] empty[FULL] = True full[BLOCKS] -= empty[BLOCKS] elif empty[BLOCKS] > full[BLOCKS]: new = [empty[BLOCKS] - full[BLOCKS], empty[ID], False] empty[ID] = full[ID] empty[BLOCKS] = full[BLOCKS] empty[FULL] = True d.insert(empty_i + 1, new) full_i += 1 full[BLOCKS] = 0 full[FULL] = False else: assert False while d[empty_i][FULL] == True: empty_i += 1 while d[full_i][FULL] == False: full_i -= 1 t = 0 i = 0 for b in d: if b[FULL] == False: break for _ in range(b[BLOCKS]): t += i * b[ID] i += 1 print(t) d = d2 full_i = len(d) - 1 while full_i > 0: full = d[full_i] prev_i = full_i for empty_i in range(0, full_i): empty = d[empty_i] if full[FULL] == False: continue if empty[FULL]: continue if empty[BLOCKS] < full[BLOCKS]: continue if empty[BLOCKS] == full[BLOCKS]: empty[FULL] = True empty[ID] = full[ID] full[FULL] = False elif empty[BLOCKS] > full[BLOCKS]: full[FULL] = False new = [full[BLOCKS], full[ID], True] d[empty_i] = new d.insert(empty_i + 1, [empty[BLOCKS] - full[BLOCKS], -1, False]) full_i += 1 break full_i -= 1 t = 0 i = 0 for b in d: for _ in range(b[BLOCKS]): if b[FULL] == True: t += i * b[ID] i += 1 print(t)