Advertisement
Guest User

Untitled

a guest
Dec 9th, 2024
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.86 KB | None | 0 0
  1. fn main() {
  2.     let input = include_str!("../input.txt").trim();
  3.     let time = std::time::Instant::now();
  4.  
  5.     let mut memory = input.chars().enumerate()
  6.         .filter_map(|(i, c)| {
  7.             c.to_digit(10).and_then(|num| {
  8.                 if num == 0 {
  9.                     None
  10.                 } else if i % 2 == 0 {
  11.                     Some((Some(i as u32 / 2), num))
  12.                 } else {
  13.                     Some((None, num))
  14.                 }
  15.             })
  16.         })
  17.         .into_iter()
  18.         .collect::<Vec<(Option<u32>, u32)>>();
  19.  
  20.     let mut i = memory.len() - 1;
  21.     while i > 1 {
  22.         if let (Some(id), files) = memory[i] {
  23.             for j in 0..i {
  24.                 if let (None, free_space) = memory[j] {
  25.                     if free_space < files {
  26.                         continue;
  27.                     }
  28.  
  29.                     if free_space == files {
  30.                         // Exact match
  31.                         memory.swap(i, j);
  32.  
  33.                     } else if free_space > files {
  34.                         // Partial match
  35.                         memory[j] = (Some(id), files);
  36.                         memory.insert(j + 1, (None, free_space - files));
  37.                         i += 1;
  38.                         memory[i] = (None, files);
  39.  
  40.                         // Conveniently not needed because of how the data is structured!
  41.                         // if memory[j + 2].0.is_none() {
  42.                         //     memory[j + 1] = (None, free_space - files + memory[j + 2].1);
  43.                         //     memory.remove(j + 1);
  44.                         // }
  45.                     }
  46.  
  47.                     let mut new_free_space = files;
  48.  
  49.                     // Merge free space with free space to the left
  50.                     if let (None, prev_space) = memory[i - 1] {
  51.                         new_free_space += prev_space;
  52.                         memory[i] = (None, new_free_space);
  53.                         memory.remove(i - 1);
  54.                         i -= 1;
  55.                     }
  56.  
  57.                     // Merge free space with free space to the right
  58.                     if let Some((None, next_space)) = memory.get(i + 1) {
  59.                         new_free_space += next_space;
  60.                         memory[i] = (None, new_free_space);
  61.                         memory.remove(i + 1);
  62.                     }
  63.  
  64.                     break;
  65.                 }
  66.             }
  67.         }
  68.  
  69.         i -= 1;
  70.     }
  71.  
  72.     let mut sum: i64 = 0;
  73.     let mut index: u32 = 0;
  74.  
  75.     for data in memory {
  76.         if let (Some(id), len) = data {
  77.             for _ in 0..len {
  78.                 sum += (id * index) as i64;
  79.                 index += 1;
  80.             }
  81.         } else if let (None, len) = data {
  82.             index += len;
  83.         }
  84.     }
  85.  
  86.     println!("Time elapsed: {:?}", time.elapsed());
  87.     println!("Sum: {}", sum);
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement