From 25c879c528a1e1816ea8bdbcd8c71bcf0681a8bf Mon Sep 17 00:00:00 2001 From: Lol3rrr Date: Thu, 8 Jan 2026 23:47:10 +0100 Subject: [PATCH] Implement 2025 - Day 3 - Part 2 --- 2025/03.rs | 78 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/2025/03.rs b/2025/03.rs index 6adafdb..0033664 100644 --- a/2025/03.rs +++ b/2025/03.rs @@ -28,48 +28,50 @@ fn main() { }).collect(); println!("{:?}", raw_banks); - let banks: Vec = raw_banks.iter().map(|rbank| { - Bank { - values: core::array::from_fn(|i| { - let i = i as u8; - - let first = rbank.iter().enumerate().find_map(|(idx, v)| { - (*v==i).then_some(idx) - })?; - let second = rbank.iter().enumerate().rev().find_map(|(idx, v)| { - (*v==i).then_some(idx) - })?; - - Some((first, second)) - }) - } - }).collect(); - println!("{:?}", banks); - - let mut result = 0; - for bank in banks.iter() { + let mut result = 0usize; + for bank in raw_banks.iter() { println!("{:?}", bank); - let iter_func = || bank.values.iter().enumerate().filter_map(|(idx, v)| { - let v = v.clone()?; - Some((idx, v)) + let mut bank_iter = bank.iter(); + let mut digits: Vec<_> = (&mut bank_iter).take(12).collect(); + + println!("Starting Digits {:?}", digits); + + for other in bank_iter { + // println!("Looking to add {}", other); + + let to_remove = digits.windows(2).enumerate().find_map(|(idx, window)| { + if window[0] >= window[1] { + return None; + } + + Some(idx) + }); + // dbg!(to_remove); + + match to_remove { + Some(to_remove) => { + digits.remove(to_remove); + digits.push(other); + } + None => { + if digits.last().copied().unwrap() < other { + digits.pop(); + digits.push(other); + } + } + }; + } + + println!("Ending Digits {:?}", digits); + + let bank_value = digits.iter().copied().rev().enumerate().fold(0usize, |acc, (idx, v)| { + acc + (*v as usize * 10usize.pow(idx as u32)) }); - - - let value = iter_func().flat_map(|f| core::iter::repeat(f.clone()).zip(iter_func())).filter_map(|(first, second)| { - if !(first.1.0 < second.1.1) { - return None; - } + println!("Value {:?}", bank_value); - let value = (first.0 * 10 + second.0) as usize; - // println!("{:?} - {:?} => {}", first, second, value); - - Some(value) - }).max().unwrap(); - println!("{:?}", value); - - result += value; + result += bank_value; } - println!("Result {:?}", result); + println!("Result: {:?}", result); }