diff options
author | mhsn <mail@mhsn.net> | 2025-09-02 15:14:35 +0100 |
---|---|---|
committer | mhsn <mail@mhsn.net> | 2025-09-02 15:14:35 +0100 |
commit | 8109ce105623d1baf0578c56f5cd8c0a865c9ad9 (patch) | |
tree | 9cee6cf7a2b6e0af93a53c0d22f67a427ef1708c | |
parent | 239398fe0b908da785a4100db9f1a44f99aed740 (diff) | |
download | aoc-8109ce105623d1baf0578c56f5cd8c0a865c9ad9.tar.gz aoc-8109ce105623d1baf0578c56f5cd8c0a865c9ad9.zip |
2024-09 rust p2
-rw-r--r-- | 2024/09/rust/src/main.rs | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/2024/09/rust/src/main.rs b/2024/09/rust/src/main.rs index 1fb892f..fa7c021 100644 --- a/2024/09/rust/src/main.rs +++ b/2024/09/rust/src/main.rs @@ -13,7 +13,7 @@ fn main() -> io::Result<()> { .collect(); let silver: usize = silver(&disk_map); - let gold: u64 = 0; + let gold: usize = gold(&disk_map); println!("silver: {silver}"); println!("gold: {gold}"); @@ -33,7 +33,7 @@ fn silver(input: &Vec<u8>) -> usize { let mut l = 0; let mut r = blocks.len() - 1; - loop { + loop { while blocks[r].is_none() { r -= 1; } @@ -47,5 +47,54 @@ fn silver(input: &Vec<u8>) -> usize { left.replace(right.take().unwrap()); } - blocks.iter().enumerate().map(|(n, id)| n * id.unwrap_or_default()).sum() + blocks + .iter() + .enumerate() + .map(|(n, id)| n * id.unwrap_or_default()) + .sum() +} + +fn gold(input: &Vec<u8>) -> usize { + let mut blocks = input + .iter() + .chain([0, 0].iter()) // lol + .array_chunks() + .enumerate() + .map(|(n, [&f, &s])| [(Some(n), f as usize), (None, s as usize)]) + .flatten() + .collect::<Vec<_>>(); + + let mut r = blocks.len(); + while r > 0 { + r -= 1; + let (Some(_), f) = blocks[r] else { + continue; + }; + + // find some empty space and maybe split + let Some(l) = blocks.iter().position(|b| b.0.is_none() && b.1 >= f) else { + continue; + }; + if l > r { + continue; + }; + + let (_, s) = &mut blocks[l]; + + let diff = *s - f; + if diff > 0 { + *s = f; + blocks.insert(l + 1, (None, diff)); + r += 1; + } + blocks.swap(l, r); + } + + blocks + .iter() + .map(|&(id, n)| [id].repeat(n)) + .flatten() + .enumerate() + .map(|(n, id)| n * id.unwrap_or_default()) + .sum() } |