Files
aocpy/2024/d9_2.py

82 lines
1.4 KiB
Python

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))