114 lines
2.2 KiB
Python
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)))
|