Implement alternative solution for d9
This commit is contained in:
@@ -1,8 +1,4 @@
|
|||||||
from lib import get_data
|
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
|
from copy import deepcopy
|
||||||
|
|
||||||
data = get_data(__file__)
|
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