diff --git a/src/main.rs b/src/main.rs index 02609a0..1da27e4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,23 +3,14 @@ use std::fs::read_to_string; fn main() { let input = read_to_string("input/day01.txt").unwrap(); - let part1 = part1(&input); - println!("part1: {}", part1); + println!("part1: {}", part1(&input)); + println!("part2: {}", part2(&input)); } type Int = i32; fn part1(input: &str) -> Int { - let (mut l, mut r) = input - .trim() - .lines() - .map(|line| line.split_ascii_whitespace().collect_tuple().unwrap()) - .map(|(x, y)| (x.parse::().unwrap(), y.parse::().unwrap())) - .fold((vec![], vec![]), |(mut v1, mut v2), (a, b)| { - v1.push(a); - v2.push(b); - (v1, v2) - }); + let (mut l, mut r) = make_lists(input); l.sort(); r.sort(); @@ -30,8 +21,32 @@ fn part1(input: &str) -> Int { .sum() } +fn part2(input: &str) -> Int { + let (l, r) = make_lists(input); + + l.iter() + .map(|l| r.iter().filter(|r| *r == l).count() as Int * l) + .sum() +} + +fn make_lists(input: &str) -> (Vec, Vec) { + input + .trim() + .lines() + .map(|line| line.split_ascii_whitespace().collect_tuple().unwrap()) + .map(|(x, y)| (x.parse::().unwrap(), y.parse::().unwrap())) + .fold((vec![], vec![]), |(mut v1, mut v2), (a, b)| { + v1.push(a); + v2.push(b); + (v1, v2) + }) +} + #[cfg(test)] -const TEST_INPUT: &str = r" +mod test { + use crate::{part1, part2}; + + const TEST_INPUT: &str = r" 3 4 4 3 2 5 @@ -40,7 +55,12 @@ const TEST_INPUT: &str = r" 3 3 "; -#[test] -fn test() { - assert_eq!(part1(TEST_INPUT), 11); + #[test] + fn test1() { + assert_eq!(part1(TEST_INPUT), 11); + } + #[test] + fn test2() { + assert_eq!(part2(TEST_INPUT), 31); + } }