From fae1c15939e94ec7c80cb9e47941df5138146350 Mon Sep 17 00:00:00 2001 From: Kees van Kempen Date: Sun, 29 Dec 2024 02:35:30 +0100 Subject: [PATCH] 2024(9): do part 1 for the test input IDs can be multidigit, which does not work for me :'). --- 2024/09/part1.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 2024/09/testinput | 1 + 2 files changed, 65 insertions(+) create mode 100644 2024/09/part1.py create mode 100644 2024/09/testinput diff --git a/2024/09/part1.py b/2024/09/part1.py new file mode 100644 index 0000000..69fa3dc --- /dev/null +++ b/2024/09/part1.py @@ -0,0 +1,64 @@ +verbose = False + +def load_disk_map(filename: str = "input") -> str: + with open(filename, "r") as fp: + data = fp.read().rstrip("\n") + return data + +def disk_map_to_blocks(disk_map: str) -> str: + blocks = "" + for i, s in enumerate(disk_map): + # file + if i % 2 == 0: + ID = i // 2 + blocks += int(s) * str(ID) + + # free space + else: + blocks += int(s) * "." + + return blocks + +def move_ltr_to_empty_space(blocks: str) -> str: + left = 0 + right = len(blocks) - 1 + + + blocks = list(blocks) + + while left < right: + if blocks[left] != ".": + left += 1 + elif blocks[right] == ".": + right -= 1 + else: + tmp = blocks[left] + blocks[left] = blocks[right] + blocks[right] = tmp + + if verbose: + print("".join(blocks)) + + return "".join(blocks) + +def checksum(blocks: str) -> int: + return sum([position * int(ID) for position, ID in enumerate(blocks.rstrip("."))]) + +if __name__ == "__main__": + disk_map = load_disk_map("testinput") + if verbose: + print("Disk map:") + print(disk_map) + print() + + blocks = disk_map_to_blocks(disk_map) + if verbose: + print("Blocks:") + print(blocks) + + result = move_ltr_to_empty_space(blocks) + + if verbose: + print() + print("Checksum:") + print(checksum(result)) diff --git a/2024/09/testinput b/2024/09/testinput new file mode 100644 index 0000000..f96c390 --- /dev/null +++ b/2024/09/testinput @@ -0,0 +1 @@ +2333133121414131402