From 7748a536ebcd4a3a08360c80529df9d89ea04a29 Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Sun, 1 Dec 2024 13:30:27 +0100 Subject: day1 solution 2 --- src/bin/day1.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/bin/day1.rs b/src/bin/day1.rs index d0c9bae..f1c6c80 100644 --- a/src/bin/day1.rs +++ b/src/bin/day1.rs @@ -3,17 +3,22 @@ static DAY: u8 = 1; fn main() { let input = advent::read_lines(DAY); println!("{DAY}a: {}", list_distance(&input)); - println!("{DAY}b: {}", 0); + println!("{DAY}b: {}", similarity(&input)); } -fn list_distance(numbers: &[String]) -> u32 { +fn parse_numbers(numbers: &[String]) -> (Vec::, Vec::) { let mut list1 = Vec::new(); let mut list2 = Vec::new(); for pair in numbers { let (number1, number2) = pair.split_once(" ").unwrap(); - list1.push(number1.parse::().unwrap()); - list2.push(number2.parse::().unwrap()); + list1.push(number1.parse::().unwrap()); + list2.push(number2.parse::().unwrap()); } + (list1, list2) +} + +fn list_distance(numbers: &[String]) -> usize { + let (mut list1, mut list2) = parse_numbers(numbers); list1.sort(); list2.sort(); @@ -23,6 +28,14 @@ fn list_distance(numbers: &[String]) -> u32 { .sum() } +fn similarity(numbers: &[String]) -> usize { + let (list1, list2) = parse_numbers(numbers); + + list1.iter() + .map(|x| x * list2.iter().filter(|&y| x == y).count()) + .sum() +} + #[cfg(test)] mod tests { use super::*; @@ -38,5 +51,6 @@ mod tests { "3 3", ].iter().map(|&x| String::from(x)).collect::>(); assert_eq!(list_distance(&input), 11); + assert_eq!(similarity(&input), 31); } } -- cgit v1.2.3