62 lines
1.1 KiB
Python
62 lines
1.1 KiB
Python
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))
|