diff options
| -rw-r--r-- | src/bin/day1.rs | 22 |
1 files 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::<usize>, Vec::<usize>) { 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::<u32>().unwrap()); - list2.push(number2.parse::<u32>().unwrap()); + list1.push(number1.parse::<usize>().unwrap()); + list2.push(number2.parse::<usize>().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::<Vec<_>>(); assert_eq!(list_distance(&input), 11); + assert_eq!(similarity(&input), 31); } } |
