From 93cca2e13567879cc880046ebd066ac891e32064 Mon Sep 17 00:00:00 2001 From: Jan Doumont Date: Mon, 8 Dec 2025 02:12:51 +0100 Subject: [PATCH] day6 --- src/day6.rs | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 +- 2 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 src/day6.rs diff --git a/src/day6.rs b/src/day6.rs new file mode 100644 index 0000000..faf4d53 --- /dev/null +++ b/src/day6.rs @@ -0,0 +1,129 @@ +#[aoc(day6, part1)] +pub fn part1(input: &str) -> u64 { + let (nums_rows, ops) = parse_input(input); + let nums_cols = transpose_nums(&nums_rows); + ops.iter() + .zip(nums_cols) + .map(|(op, nums)| match op { + Operator::Add => nums.iter().sum(), + Operator::Mult => nums.iter().fold(1, |x, y| x * y), + }) + .sum() +} + +#[aoc(day6, part2)] +pub fn part2(input: &str) -> u64 { + let (nums, ops) = parse_input_2(input); + ops.iter() + .zip(nums) + .map(|(op, nums)| match op { + Operator::Add => nums.iter().sum(), + Operator::Mult => nums.iter().fold(1, |x, y| x * y), + }) + .sum() +} +#[derive(Debug)] +enum Operator { + Add, + Mult, +} + +fn parse_input(input: &str) -> (Vec>, Vec) { + ( + input + .lines() + .take_while(|l| l.trim_ascii_start().chars().next().unwrap().is_digit(10)) + .map(|l| { + { + l.split_ascii_whitespace() + .map(|x| x.parse::().unwrap()) + .collect::>() + } + }) + .collect(), + input + .lines() + .last() + .unwrap() + .split_whitespace() + .map(|x| match x { + "+" => Operator::Add, + "*" => Operator::Mult, + _ => panic!("Undefined operation {}", x), + }) + .collect(), + ) +} + +fn parse_input_2(input: &str) -> (Vec>, Vec) { + let n = input.lines().count() - 1; + let m_chars = input.lines().next().unwrap().chars().count(); + let mut char_cols = vec![Vec::with_capacity(n); m_chars]; + + for (i, line) in input.lines().take(n).enumerate() { + for (j, char) in line.chars().enumerate() { + char_cols[j].insert(i, char); + } + } + + let ops: Vec = input + .lines() + .last() + .unwrap() + .split_whitespace() + .map(|x| match x { + "+" => Operator::Add, + "*" => Operator::Mult, + _ => panic!("Undefined operation {}", x), + }) + .collect(); + + let mut nums: Vec> = vec![Vec::new(); ops.len()]; + + let mut op_counter = 0; + for col in char_cols { + let numstr = col.iter().collect::(); + if numstr.trim().is_empty() { + op_counter = op_counter + 1; + } else { + nums[op_counter].push(numstr.trim().parse::().unwrap_or(0)); + } + } + + assert_eq!(ops.len(), nums.len()); + (nums, ops) +} + +fn transpose_nums(nums: &Vec>) -> Vec> { + let n = nums.len(); + let m = nums[0].len(); + let mut columns = vec![Vec::with_capacity(n); m]; + for (i, line) in nums.iter().enumerate() { + for (j, num) in line.iter().enumerate() { + columns[j].insert(i, *num); + } + } + columns +} + +#[cfg(test)] +mod tests { + use super::*; + + const EXAMPLE_INPUT: &str = "\ +123 328 51 64 + 45 64 387 23 + 6 98 215 314 +* + * + +"; + + #[test] + fn test_part1() { + assert_eq!(part1(EXAMPLE_INPUT), 4277556); + } + + #[test] + fn test_part2() { + assert_eq!(part2(EXAMPLE_INPUT), 3263827); + } +} diff --git a/src/lib.rs b/src/lib.rs index c7ba38e..10f8ffb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,6 +7,7 @@ extern crate aoc_runner_derive; // pub mod day2; // pub mod day3; // pub mod day4; -pub mod day5; +// pub mod day5; +pub mod day6; aoc_lib! { year = 2025 }