From 1b6502df7adc946ee998f209e71d7a0f2972efd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Engl=C3=B6f=20Ytterstr=C3=B6m?= Date: Mon, 9 Dec 2024 13:30:39 +0100 Subject: [PATCH] Solve 2024:9 p1-2 "Disk Fragmenter" Hard one. Comparing to earlier years, the difficulty level seems higher than usual. I blame the LLM hipsters. This one I asumed, but missed when I tried to find it: > "If a block contains free space, skip it instead." Lucky me. --- 2024-python/aoc.py | 6 ++-- 2024-python/output/day_09.py | 67 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 2024-python/output/day_09.py diff --git a/2024-python/aoc.py b/2024-python/aoc.py index 1842c0a..7ee986e 100644 --- a/2024-python/aoc.py +++ b/2024-python/aoc.py @@ -30,11 +30,11 @@ if day_no and name: s.write( f""" import re -from collections import deque, Counter +from collections import deque, Counter, defaultdict from heapq import heappop, heappush -from itertools import compress, combinations, chain +from itertools import compress, combinations, chain, permutations -from output import matrix, D, DD, ADJ, ints, mhd, mdbg, vdbg +from output import matrix, D, DD, ADJ, ints, mhd, mdbg, vdbg, cw, ccw def solve(data): diff --git a/2024-python/output/day_09.py b/2024-python/output/day_09.py new file mode 100644 index 0000000..048d855 --- /dev/null +++ b/2024-python/output/day_09.py @@ -0,0 +1,67 @@ +from collections import deque + + +def solve(data): + blocks_checksum = defrag(data) + files_checksum = defrag(data, True) + return blocks_checksum, files_checksum + + +def defrag(data, move_files=False): + expected_seq_len = sum(map(int, data[::2])) + seq = dict() + gaps = dict() + q = deque([]) + i = 0 + for fileid, pair in enumerate(zip(data[::2], data[1::2] + "0")): + size, free = map(int, pair) + q.append((i, fileid, size)) + for _ in range(int(size)): + seq[i] = fileid + i += 1 + gaps[i] = free + i += int(free) + while q: + i, fileid, size = q.pop() + if move_files: + updated = False + for pos, space in gaps.items(): + if pos > i: + continue + if size <= space: + rem = space - size + updated = True + break + if updated: + for k in range(size): + seq[pos + k] = fileid + for k in range(i, i + size): + del seq[k] + del gaps[pos] + gaps[pos + size] = rem + gaps = dict(sorted(gaps.items(), key=lambda x: x[0])) + else: + move = False + for j in range(size): + for k in range(expected_seq_len): + if k not in seq: + seq[k] = fileid + del seq[i + j] + move = True + break + if not move: + break + return sum( + pos * id + for pos, id in enumerate(seq.get(fileid, 0) for fileid in range(max(seq) + 1)) + ) + + +if __name__ == "__main__": + with open("./input/09.txt", "r") as f: + inp = f.read().strip() + + p1, p2 = solve(inp) + + print(p1) + print(p2)