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]: #print("if ", end=" ") left += 1 # TODO: Shouldn't we take care of this in the partial block? elif len(files[right]) == 0: del(files[right]) elif "." in files[right] \ or files[left].count(".") < len(files[right]): right -= 1 #print("elif", end=" ") # fully swap elif files[left].count(".") == len(files[right]): #print("part", end=" ") tmp = files[left] files[left] = files[right] files[right] = tmp # Restart trying from the right right = len(files) - 1 # TODO: Concatenate empty space # 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[idx_right_after_insertion]) == 0: #print("deleting") del(files[idx_right_after_insertion]) #print("RIGHT: ", files[right]) # Restart trying from the right right = len(files) - 1 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)))