diff options
-rw-r--r-- | 2024/09/rust/Cargo.lock | 7 | ||||
-rw-r--r-- | 2024/09/rust/Cargo.toml | 6 | ||||
-rw-r--r-- | 2024/09/rust/src/main.rs | 51 |
3 files changed, 64 insertions, 0 deletions
diff --git a/2024/09/rust/Cargo.lock b/2024/09/rust/Cargo.lock new file mode 100644 index 0000000..1a4e400 --- /dev/null +++ b/2024/09/rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aoc_2024-09" +version = "0.1.0" diff --git a/2024/09/rust/Cargo.toml b/2024/09/rust/Cargo.toml new file mode 100644 index 0000000..b440a8b --- /dev/null +++ b/2024/09/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "aoc_2024-09" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/2024/09/rust/src/main.rs b/2024/09/rust/src/main.rs new file mode 100644 index 0000000..1fb892f --- /dev/null +++ b/2024/09/rust/src/main.rs @@ -0,0 +1,51 @@ +#![feature(iter_array_chunks)] + +use std::io; + +fn main() -> io::Result<()> { + let disk_map = io::stdin() + .lines() + .flatten() + .next() + .unwrap() + .chars() + .map(|c| c as u8 - b'0') + .collect(); + + let silver: usize = silver(&disk_map); + let gold: u64 = 0; + println!("silver: {silver}"); + println!("gold: {gold}"); + + return Ok(()); +} + +fn silver(input: &Vec<u8>) -> usize { + let mut blocks = input + .iter() + .chain([0, 0].iter()) // lol + .array_chunks() + .enumerate() + .map(|(n, [&f, &s])| [[Some(n)].repeat(f as usize), [None].repeat(s as usize)]) + .flatten() + .flatten() + .collect::<Vec<_>>(); + + let mut l = 0; + let mut r = blocks.len() - 1; + loop { + while blocks[r].is_none() { + r -= 1; + } + while blocks[l].is_some() { + l += 1; + } + if l >= r { + break; + } + let [left, right] = blocks.get_disjoint_mut([l, r]).unwrap(); + left.replace(right.take().unwrap()); + } + + blocks.iter().enumerate().map(|(n, id)| n * id.unwrap_or_default()).sum() +} |