From e9211c26a31132414d77b85ce79a847db8a45266 Mon Sep 17 00:00:00 2001 From: felixm Date: Mon, 9 Dec 2024 22:13:25 -0500 Subject: [PATCH] Implement alternative solution for d9 --- 2024/d9.py | 4 --- 2024/d9_2.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 2024/d9_2.py diff --git a/2024/d9.py b/2024/d9.py index d18d908..2f4b245 100644 --- a/2024/d9.py +++ b/2024/d9.py @@ -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__) diff --git a/2024/d9_2.py b/2024/d9_2.py new file mode 100644 index 0000000..d126813 --- /dev/null +++ b/2024/d9_2.py @@ -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))