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)))