From 3b3a11bf7f155e280b6465fff48da561c6e46a91 Mon Sep 17 00:00:00 2001 From: sepia Date: Mon, 9 Dec 2024 12:34:48 -0600 Subject: [PATCH] Day 9 --- src/day9.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 4 +++- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/day9.rs diff --git a/src/day9.rs b/src/day9.rs new file mode 100644 index 0000000..9cf8dd0 --- /dev/null +++ b/src/day9.rs @@ -0,0 +1,49 @@ +const ALLOW_SEPARATION: bool = false; + +pub fn day9() { + let mut regions: Vec<(Option, usize)> = crate::input(9) + .chars() + .filter_map(|c| c.to_string().parse::().ok()) + .enumerate() + .flat_map(|(i, size)| { + let file_id = (i % 2 == 0).then_some(i / 2); + if ALLOW_SEPARATION { + vec![(file_id, 1); size] + } else { + vec![(file_id, size)] + } + }) + .collect(); + + for i in (0..regions.len()).rev() { + let (Some(_), file_size) = regions[i] else { + continue; + }; + let Some(slot_index) = regions[..i] + .iter() + .position(|&(slot, slot_size)| slot.is_none() && slot_size >= file_size) + else { + continue; + }; + let slot_size = regions[slot_index].1; + + regions[slot_index] = regions[i]; + regions[i] = (None, file_size); + if slot_size > file_size { + regions.insert(slot_index + 1, (None, slot_size - file_size)); + } + } + + let disk: Vec> = regions + .into_iter() + .flat_map(|(file_id, size)| vec![file_id; size]) + .collect(); + + let checksum: usize = disk + .into_iter() + .enumerate() + .filter_map(|(i, f)| Some(i * f? as usize)) + .sum(); + + println!("Checksum: {}", checksum); +} diff --git a/src/main.rs b/src/main.rs index d324f4a..2f09c00 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,10 +12,12 @@ mod day5; mod day6; #[allow(dead_code)] mod day7; +#[allow(dead_code)] mod day8; +mod day9; fn main() { - day8::day8(); + day9::day9(); } pub fn input(day: u8) -> String {