summaryrefslogtreecommitdiff
path: root/2024/09/rust/src
diff options
context:
space:
mode:
authormhsn <mail@mhsn.net>2025-09-02 15:14:35 +0100
committermhsn <mail@mhsn.net>2025-09-02 15:14:35 +0100
commit8109ce105623d1baf0578c56f5cd8c0a865c9ad9 (patch)
tree9cee6cf7a2b6e0af93a53c0d22f67a427ef1708c /2024/09/rust/src
parent239398fe0b908da785a4100db9f1a44f99aed740 (diff)
downloadaoc-8109ce105623d1baf0578c56f5cd8c0a865c9ad9.tar.gz
aoc-8109ce105623d1baf0578c56f5cd8c0a865c9ad9.zip
2024-09 rust p2
Diffstat (limited to '2024/09/rust/src')
-rw-r--r--2024/09/rust/src/main.rs55
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()
}