Files
adventofcode/2024/09/part2.py

114 lines
2.2 KiB
Python

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
elif int(s) > 0:
files += [int(s) * "."]
return files
def move_files_ltr_to_empty_space(files: list) -> str:
left = 0
right = len(files) - 1
while 0 < right:
#print(files)
#print(left, right)
# Concatenate empty space
while "." in files[left] and "." in files[left + 1]:
files[left] += files[left + 1]
del(files[left + 1])
right -= 1
if not left < right:
right -= 1
left = 0
continue
if not "." in files[left]:
#print("if ", end=" ")
left += 1
elif "." in files[right]:
right -= 1
#print("elif", end=" ")
elif files[left].count(".") < len(files[right]):
left += 1
continue
# fully swap
elif files[left].count(".") == len(files[right]):
#print("full", end=" ")
tmp = files[left]
files[left] = files[right]
files[right] = tmp
# Restart trying from the left
left = 0
right -= 1
# partially swap
else:
#print("part", end=" ")
#print(left, right)
#print(files[left], files[right])
#print("." in files[right])
#print(files[right])
tmp = files[left]
files[left] = files[right]
files.insert(left + 1, tmp[:-len(files[right])])
idx_right_after_insertion = right + 1
files[idx_right_after_insertion] = tmp[:len(files[idx_right_after_insertion])]
if len(files[right]) == 0:
del(files[idx_right_after_insertion])
right -= 1
#print("RIGHT: ", files[right])
# Restart trying from the left
left = 0
if verbose:
print(files_to_blocks(files))
#print(files)
return files
def files_to_blocks(files: list) -> str:
ret = ""
for f in files:
ret += "".join(f)
#print(f)
return ret
# return ["".join(file) for file in files]
#def blocks_to_str
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)
print(files_to_blocks(files))
result = move_files_ltr_to_empty_space(files)
if verbose:
print()
print("Checksum:")
print(checksum(files_to_blocks(result)))