From 945d63e8e1e6571da5eaa95557abac125db26225 Mon Sep 17 00:00:00 2001 From: Kees van Kempen Date: Sun, 29 Dec 2024 03:01:43 +0100 Subject: [PATCH] 2024(9): part 2 WIP --- 2024/09/part2.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 2024/09/part2.py diff --git a/2024/09/part2.py b/2024/09/part2.py new file mode 100644 index 0000000..18ad5e6 --- /dev/null +++ b/2024/09/part2.py @@ -0,0 +1,69 @@ +from part1 import * + + +verbose = True + +def disk_map_to_files(disk_map: str) -> list: + files = [] + for i, s in enumerate(disk_map): + # file + if i % 2 == 0: + ID = i // 2 + files += [int(s) * [str(ID)]] + + # free space + else: + files += [int(s) * "."] + + return files + +def move_files_ltr_to_empty_space(files: list) -> str: + left = 0 + right = len(files) - 1 + + while left < right: + if not "." in files[left]: + left += 1 + elif "." in files[right] \ + or files[left].count(".") < len(files[right]): + right -= 1 + # fully swap + elif files[left].count(".") == len(files[right]): + tmp = files[left] + files[left] = files[right] + files[right] = tmp + # partially swap + else: + tmp = files[left] + files[left] = files[right] + files.insert(left + 1, tmp[:-len(files[right])]) + files[right] = tmp[len(files[right])] + + if verbose: + print(files) + + return files + +def files_to_blocks(files: list) -> str: + for f in files: + print(f) + return sum(files) + +if __name__ == "__main__": + disk_map = load_disk_map("testinput") + if verbose: + print("Disk map:") + print(disk_map) + print() + + files = disk_map_to_files(disk_map) + if verbose: + print("Files:") + print(files) + + result = move_files_ltr_to_empty_space(files) + + if verbose: + print() + print("Checksum:") + print(checksum(files_to_blocks(result)))