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) -> list: 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: list) -> str: left = 0 right = len(blocks) - 1 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(blocks) return blocks def checksum(blocks: str) -> int: return sum([position * int(ID) for position, ID in enumerate(blocks) if ID != "."]) if __name__ == "__main__": disk_map = load_disk_map("input") 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))