82 lines
1.4 KiB
Python
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))
|