From c7683b36008fbea06cb02510b7ec6875a15158a4 Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Wed, 3 Dec 2025 19:09:15 +0100 Subject: [PATCH] Solve 2025 day 3 part 2 in rust --- 2025/rust/day-03/src/main.rs | 44 +++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/2025/rust/day-03/src/main.rs b/2025/rust/day-03/src/main.rs index 693512b..a4e079d 100644 --- a/2025/rust/day-03/src/main.rs +++ b/2025/rust/day-03/src/main.rs @@ -3,7 +3,8 @@ use std::fs; fn main() { let banks = parse_input(&fs::read_to_string("../../inputs/03.txt").unwrap()); - println!("Total output joltage: {}", total_joltage(banks)); + println!("Total output joltage: {}", total_joltage(&banks, 2)); + println!("New total output joltage: {}", total_joltage(&banks, 12)); } fn parse_input(contents: &str) -> Vec> { @@ -14,24 +15,31 @@ fn parse_input(contents: &str) -> Vec> { .collect() } -fn total_joltage(banks: Vec>) -> u32 { - banks.iter().map(|bank| largest_joltage(bank)).sum() +fn total_joltage(banks: &[Vec], number_of_activate_batteries: usize) -> u64 { + banks + .iter() + .map(|bank| largest_joltage(bank, number_of_activate_batteries)) + .sum() } -fn largest_joltage(batteries: &[u8]) -> u32 { - let mut first = batteries[0]; - let mut second = batteries[1]; +fn largest_joltage(batteries: &[u8], number_of_activate_batteries: usize) -> u64 { + let mut active_batteries: Vec = batteries[0..number_of_activate_batteries].into(); - for i in 1..batteries.len() - 1 { - if batteries[i] > first { - first = batteries[i]; - second = batteries[i + 1]; - } else if batteries[i + 1] > second { - second = batteries[i + 1]; + for i in 1..batteries.len() - (number_of_activate_batteries - 1) { + for j in 0..number_of_activate_batteries { + if batteries[j + i] > active_batteries[j] { + active_batteries[j..number_of_activate_batteries] + .copy_from_slice(&batteries[j + i..number_of_activate_batteries + i]); + } } } - (first * 10 + second) as u32 + active_batteries + .iter() + .rev() + .enumerate() + .map(|(i, joltage)| *joltage as u64 * 10_u64.pow(i as u32)) + .sum() } #[cfg(test)] @@ -41,11 +49,15 @@ mod tests { const TEST_INPUT: &str = "987654321111111 811111111111119 234234234234278 -818181911112111 -"; +818181911112111"; #[test] fn test_part1() { - assert_eq!(total_joltage(parse_input(TEST_INPUT)), 357); + assert_eq!(total_joltage(&parse_input(TEST_INPUT), 2), 357); + } + + #[test] + fn test_part2() { + assert_eq!(total_joltage(&parse_input(TEST_INPUT), 12), 3121910778619); } }