from lib import get_data data = get_data("d9.py") def parse(data): xs = [] f = True i = 0 for c in data.strip(): if f: for _ in range(int(c)): xs.append(i) f = False i += 1 else: for _ in range(int(c)): xs.append(".") f = True return xs def score(xs): t = 0 for i, j in enumerate(xs): if j == ".": continue t += i * j return t xs = parse(data) i, j = 0, len(xs) - 1 while i <= j: while xs[i] != ".": i += 1 while xs[j] == ".": j -= 1 if not i <= j: break xs[i], xs[j] = xs[j], xs[i] print(score(xs)) xs = parse(data) idx = {} ids = [] for i, x in enumerate(xs): if x == ".": continue if not x in idx: idx[x] = i ids.append(x) while ids: id = ids.pop() i1, i2 = idx[id], idx[id] while i2 < len(xs) and xs[i2] == id: i2 += 1 j1 = 0 while j1 < i1: while xs[j1] != ".": j1 += 1 if not j1 < i1: break j2 = j1 while xs[j2] == ".": j2 += 1 assert j2 <= i1 if i2 - i1 <= j2 - j1: for j, i in zip(range(j1, j2), range(i1, i2)): xs[j], xs[i] = xs[i], xs[j] break j1 = j2 print(score(xs))