with open('input.text', 'r') as file: data = file.read() drive: list[int] = [] is_file = True f_id = 0 for c in data: if is_file: drive.extend([f_id] * int(c)) f_id += 1 else: drive.extend([-1] * int(c)) is_file = not is_file def print_drive(drive: list[int]) -> None: for i in drive: if i != -1: print(i, end='') else: print('.', end='') print() def compress_drive(drive: list[int]) -> list[int]: max_f_id: int = max(drive) while max_f_id != 0: file_index: int = drive.index(max_f_id) size: int = drive.count(max_f_id) free_size = 0 free_index = None found_block = False for i, id in enumerate(drive): if i >= file_index: break if id == -1: free_size += 1 if not free_index: free_index = i else: free_size = 0 free_index = None if free_size >= size: found_block = True break if found_block: drive[file_index:file_index + size] = [-1] * size drive[free_index:free_index + size] = [max_f_id] * size max_f_id -= 1 return drive def checksum(drive: list[int]) -> int: s = 0 for i, id in enumerate(drive): if id != -1: s += i * id return s # print_drive(drive) # print_drive(compress_drive(drive)) drive = compress_drive(drive) print(checksum(drive))