static DAY: u8 = 1; fn main() { let input = advent::read_lines(DAY); println!("{DAY}a: {}", list_distance(&input)); println!("{DAY}b: {}", similarity(&input)); } 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, list2) } fn list_distance(numbers: &[String]) -> usize { let (mut list1, mut list2) = parse_numbers(numbers); list1.sort(); list2.sort(); list1.iter() .enumerate() .map(|(i, number1)| number1.abs_diff(list2[i])) .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::*; #[test] fn test() { let input = [ "3 4", "4 3", "2 5", "1 3", "3 9", "3 3", ].iter().map(|&x| String::from(x)).collect::>(); assert_eq!(list_distance(&input), 11); assert_eq!(similarity(&input), 31); } }