Implement alternative solution for d9
This commit is contained in:
@@ -1,8 +1,4 @@
|
||||
from lib import get_data
|
||||
from lib import Grid2D
|
||||
from lib import ints
|
||||
from itertools import combinations
|
||||
from collections import defaultdict
|
||||
from copy import deepcopy
|
||||
|
||||
data = get_data(__file__)
|
||||
|
||||
81
2024/d9_2.py
Normal file
81
2024/d9_2.py
Normal file
@@ -0,0 +1,81 @@
|
||||
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))
|
||||
Reference in New Issue
Block a user