From fe181838e899d4028713cee95ffcfa31fb696ed9 Mon Sep 17 00:00:00 2001 From: Sijmen Date: Thu, 4 Jan 2024 04:43:34 +0100 Subject: [PATCH] h --- day14.py | 61 ++++++++++++++++++++++++++++++++-------------------- day15.py | 65 +++++++++++++++++++++++++++++++------------------------- 2 files changed, 74 insertions(+), 52 deletions(-) diff --git a/day14.py b/day14.py index 99a8301..35af73e 100644 --- a/day14.py +++ b/day14.py @@ -2,57 +2,72 @@ import sys from pprint import pprint from copy import deepcopy + def shift(map, dx, dy): - swapped = True - while swapped: - swapped = False - for y in range(max(0, -dy), len(map) - max(0, dy)): - for x in range(max(0, -dx), len(map) - max(0, dx)): - if map[y + dy][x + dx] == "." and map[y][x] == "O": - map[y + dy][x + dx] = "O" - map[y][x] = "." - swapped = True + for y in range(max(0, -dy), len(map) - max(0, dy)): + for x in range(max(0, -dx), len(map) - max(0, dx)): + (x1, y1) = (x, y) + while True: + (x2, y2) = (x1 + dx, y1 + dy) + if 0 <= y2 < len(map) and 0 <= x2 < len(map[y2]) and map[y2][x2] == ".": + (x1, y1) = (x2, y2) + else: + break + + if (x1, y1) != (x, y): + map[y1][x1] = "O" + map[y][x] = "." + def weigh(map): return sum((len(map) - y) * row.count("O") for (y, row) in enumerate(map)) -CYCLES = 1_000_000_000 +# @profile def main(): + CYCLES = 1_000_000_000 + with open(sys.argv[1]) as f: - map = [list(l) for l in f.read().strip().splitlines()] + map = [[c for c in l] for l in f.read().strip().splitlines()] part1 = 0 + pprint(map) shift(map, 0, -1) + pprint(map) part1 = weigh(map) + shift(map, -1, 0) + pprint(map) + shift(map, 0, 1) + pprint(map) + shift(map, 1, 0) + pprint(map) + + for i in range(1, 100): + shift(map, 0, -1) + shift(map, -1, 0) + shift(map, 0, 1) + shift(map, 1, 0) seen = {} history = [] - for i in range(CYCLES): + (i, j) = (0, 0) + for i in range(100, CYCLES): shift(map, 0, -1) - if i == 0: pprint(map) shift(map, -1, 0) - if i == 0: pprint(map) shift(map, 0, 1) - if i == 0: pprint(map) shift(map, 1, 0) - if i == 0: pprint(map) s = str(map) + history.append(weigh(map)) if s in seen: + j = seen[s] break seen[s] = i - history.append(weigh(map)) - j = seen[s] - offset = (CYCLES - j) % (i + 1 - j) + j + offset = (CYCLES - j) % (i - j) - 1 part2 = history[offset] print(part1, part2) main() - -# 98887 too low -# 98898 too high -# 103761 too high diff --git a/day15.py b/day15.py index 35834a7..22fb4f7 100644 --- a/day15.py +++ b/day15.py @@ -2,7 +2,8 @@ import os import sys from collections import defaultdict -def hash(s): + +def hash(s: str) -> int: v = 0 for c in s: if c == ",": @@ -12,36 +13,42 @@ def hash(s): v %= 256 return v -with open(sys.argv[1]) as f: - s = f.read().strip() -boxes = defaultdict(list) +def main() -> None: + with open(sys.argv[1]) as f: + s = f.read().strip() -part1 = 0 -for s_ in s.split(","): - part1 += hash(s_) + boxes: defaultdict[int, list[tuple[str, int]]] = defaultdict(list) - if s_[-1] == "-": - label = s_[:-1] - h = hash(label) - for i in range(len(boxes[h])): - if boxes[h][i][0] == label: - del boxes[h][i] - break - elif s_[-2] == "=": - label = s_[:-2] - focal = int(s_[-1]) - h = hash(label) - for i in range(len(boxes[h])): - if boxes[h][i][0] == label: - boxes[h][i] = (label, focal) - break - else: - boxes[h].append((label, focal)) + part1 = 0 + for s_ in s.split(","): + part1 += hash(s_) -part2 = 0 -for (box_i, box) in boxes.items(): - for (slot, (_, focal)) in enumerate(box): - part2 += (box_i + 1) * (slot + 1) * focal + if s_[-1] == "-": + label = s_[:-1] + h = hash(label) + for i in range(len(boxes[h])): + if boxes[h][i][0] == label: + del boxes[h][i] + break + elif s_[-2] == "=": + label = s_[:-2] + focal = int(s_[-1]) + h = hash(label) + for i in range(len(boxes[h])): + if boxes[h][i][0] == label: + boxes[h][i] = (label, focal) + break + else: + boxes[h].append((label, focal)) -print(part1, part2) + part2 = 0 + for (box_i, box) in boxes.items(): + for (slot, (_, focal)) in enumerate(box): + part2 += (box_i + 1) * (slot + 1) * focal + + print(part1, part2) + + +if __name__ == "__main__": + main()