diff --git a/src/lib.rs b/src/lib.rs index 55a2f04..0535e93 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -pub fn day1_part1(input: &str) -> String { +pub fn day1_preprocess(input: &str) -> (Vec, Vec) { let pairs: Vec> = input .lines() .map(|line| { @@ -12,11 +12,32 @@ pub fn day1_part1(input: &str) -> String { let mut right = pairs.iter().map(|pair| pair[1]).collect::>(); left.sort(); right.sort(); - - let sum: u32 = left.iter().zip(right).map(|(left, right)| left.abs_diff(right)).sum(); + (left, right) +} +pub fn day1_part1(input: &str) -> String { + let (left, right) = day1_preprocess(input); + let sum: u32 = left + .iter() + .zip(right) + .map(|(left, right)| left.abs_diff(right)) + .sum(); sum.to_string() } +pub fn day1_part2(input: &str) -> String { + let (left, right) = day1_preprocess(input); + let similarity_score: u32 = left.into_iter() + .map(|left_location| { + left_location + * right + .iter() + .filter(|&&right_location| right_location == left_location) + .count() as u32 + }) + .sum(); + similarity_score.to_string() +} + #[cfg(test)] mod tests { use super::*; @@ -28,4 +49,12 @@ mod tests { let result = day1_part1(include_str!("../input/day1.txt")); assert_eq!(result, "2742123"); } + + #[test] + fn day1_part2_test() { + let test_result = day1_part2(include_str!("../input/day1_part1.test.txt")); + assert_eq!(test_result, "31"); + let result = day1_part2(include_str!("../input/day1.txt")); + assert_eq!(result, "21328497"); + } }