Remove free space objects when no more free space : improve part2 speed from 10ms...
authorGreg Burri <greg.burri@gmail.com>
Mon, 9 Dec 2024 23:20:40 +0000 (00:20 +0100)
committerGreg Burri <greg.burri@gmail.com>
Mon, 9 Dec 2024 23:20:40 +0000 (00:20 +0100)
src/day09.rs

index eac0b8c..31a23cd 100644 (file)
@@ -90,7 +90,8 @@ pub fn defrag_v2(mut memory: Vec<u32>) -> Vec<u32> {
     }
 
     for f in files.iter().rev() {
-        for free_space in free_spaces.iter_mut() {
+        for i in 0..free_spaces.len() {
+            let free_space = &mut free_spaces[i];
             // Files are only move backward.
             if free_space.pos >= f.pos {
                 break;
@@ -100,7 +101,11 @@ pub fn defrag_v2(mut memory: Vec<u32>) -> Vec<u32> {
                 memory[free_space.pos..free_space.pos + f.size].fill(v);
                 memory[f.pos..f.pos + f.size].fill(EMPTY);
                 free_space.size -= f.size;
-                free_space.pos += f.size;
+                if free_space.size == 0 {
+                    free_spaces.remove(i);
+                } else {
+                    free_space.pos += f.size;
+                }
                 break;
             }
         }