diff --git a/2024/day9/main.py b/2024/day9/main.py index a377a0e..9d55ad7 100644 --- a/2024/day9/main.py +++ b/2024/day9/main.py @@ -57,6 +57,13 @@ class DiskMap: return None + def findOffsetLastFile(self, offset: int) -> int | None: + for i, block in reversed(list(enumerate(self.blocks)))[offset:]: + if type(block) == FileBlock: + return i + + return None + def findFreeBlockOfBestFit(self, size: int) -> int | None: for i, block in enumerate(self.blocks): if type(block) == FreeBlock and block.size >= size: @@ -64,6 +71,13 @@ class DiskMap: return None + def moveFile(self, file: FileBlock, dest: FreeBlock) -> bool: + if dest.size > file.size: + return False + + + + def compact(self) -> None: while True: free_index = self.findFreeBlock() @@ -93,6 +107,20 @@ class DiskMap: if remaining_file_size: self.blocks.insert(file_index, FileBlock(remaining_file_size, file_id)) + def compact2(self) -> None: + offset = 0 + while True: + file_index: int = self.findOffsetLastFile(offset) + file_size: int = self.blocks[file_index].size + + free_index: int = self.findFreeBlockOfBestFit(file_size) + free_size: int = self.blocks[free_index].size + + if file_index == None: + break + + offset = len(self.blocks) - file_index + def __str__(self) -> str: s = '' for block in self.blocks: