diff --git a/src/2024/day1/rust/mod.rs b/src/2024/day1/rust/mod.rs index 44dd4ec..0e991d1 100644 --- a/src/2024/day1/rust/mod.rs +++ b/src/2024/day1/rust/mod.rs @@ -1,43 +1,41 @@ pub fn part_a(input: &str) -> i32 { - let mut left_list: Vec = Vec::new(); - let mut right_list: Vec = Vec::new(); - for line in input.lines() { - let parts: Vec<&str> = line.split_whitespace().collect(); - left_list.push(parts[0].parse().unwrap()); - right_list.push(parts[1].parse().unwrap()); - } + let (mut left_list, mut right_list): (Vec, Vec) = input + .lines() + .map(|line| { + line.split_whitespace() + .map(|num| num.parse().expect("should be a number")) + .collect::>() + }) + .map(|parts| (parts[0], parts[1])) + .unzip(); left_list.sort(); right_list.sort(); - let mut sum = 0; - for (left, right) in left_list.iter().zip(right_list.iter()) { - sum += (left - right).abs(); - } - - sum + left_list + .iter() + .zip(right_list.iter()) + .map(|(left, right)| (left - right).abs()) + .sum() } pub fn part_b(input: &str) -> i32 { - let mut left_list: Vec = Vec::new(); - let mut right_list: Vec = Vec::new(); - for line in input.lines() { - let parts: Vec<&str> = line.split_whitespace().collect(); - left_list.push(parts[0].parse().unwrap()); - right_list.push(parts[1].parse().unwrap()); - } - left_list.sort(); - right_list.sort(); - let mut sum = 0; - for left in left_list.iter() { - let mut count = 0; - for right in right_list.iter() { - if left == right { - count += 1; - } - } - sum += left * count; + let (left_list, right_list): (Vec, Vec) = input + .lines() + .map(|line| { + let parts: Vec = line + .split_whitespace() + .map(|num| num.parse().expect("should be a number")) + .collect(); + (parts[0], parts[1]) + }) + .unzip(); + let mut right_count = std::collections::HashMap::new(); + for right in right_list { + *right_count.entry(right).or_insert(0) += 1; } - - sum + left_list + .iter() + .map(|left| left * right_count.get(left).unwrap_or(&0)) + .sum() } pub fn main() { @@ -50,7 +48,31 @@ pub fn main() { println!("Day {} Example Part B: {}", day, part_b(example_input)); println!("Day {} Part B: {}", day, part_b(input)); } +#[cfg(test)] +mod tests { + use super::*; -// #[cfg(test)] -// mod tests { -// } + #[test] + fn test_part_a_example() { + let example_input = include_str!("../input_example.txt"); + assert_eq!(part_a(example_input), 11); + } + + #[test] + fn test_part_a() { + let input = include_str!("../input.txt"); + assert_eq!(part_a(input), 2113135); + } + + #[test] + fn test_part_b_example() { + let example_input_b = include_str!("../input_example.txt"); + assert_eq!(part_b(example_input_b), 31); + } + + #[test] + fn test_part_b() { + let input = include_str!("../input.txt"); + assert_eq!(part_b(input), 19097157); + } +}