From 8884e46983bcde6e1c6f1c5c2ce3b2dde49e04bd Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 1 Dec 2024 17:59:27 +0100 Subject: [PATCH] restructured for more days --- src/day01.rs | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ src/day02.rs | 17 +++++++++++++ src/lib.rs | 2 ++ src/main.rs | 69 ++++++---------------------------------------------- 4 files changed, 92 insertions(+), 62 deletions(-) create mode 100644 src/day01.rs create mode 100644 src/day02.rs create mode 100644 src/lib.rs diff --git a/src/day01.rs b/src/day01.rs new file mode 100644 index 0000000..aa97ec1 --- /dev/null +++ b/src/day01.rs @@ -0,0 +1,66 @@ +use itertools::Itertools; +use std::fs::read_to_string; + +pub fn day_main() { + let input = read_to_string("input/day01.txt").unwrap(); + println!("part1: {}", part1(&input)); + println!("part2: {}", part2(&input)); +} + +type Int = i32; + +fn part1(input: &str) -> Int { + let (mut l, mut r) = make_lists(input); + + l.sort(); + r.sort(); + + l.into_iter() + .zip(r.into_iter()) + .map(|(l, r)| (l - r).abs()) + .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)] +mod test { + use super::{part1, part2}; + + const TEST_INPUT: &str = r" +3 4 +4 3 +2 5 +1 3 +3 9 +3 3 +"; + + #[test] + fn test1() { + assert_eq!(part1(TEST_INPUT), 11); + } + #[test] + fn test2() { + assert_eq!(part2(TEST_INPUT), 31); + } +} diff --git a/src/day02.rs b/src/day02.rs new file mode 100644 index 0000000..13e76ca --- /dev/null +++ b/src/day02.rs @@ -0,0 +1,17 @@ +use std::fs::read_to_string; + +pub fn day_main() { + let input = read_to_string("input/day01.txt").unwrap(); + println!("part1: {}", part1(&input)); + // println!("part2: {}", part2(&input)); +} + +type Int = i32; + +fn part1(input: &str) -> Int { + 0 +} + +// fn part2(input: &str) -> Int { +// 0 +// } diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..28326d5 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,2 @@ +pub mod day01; +pub mod day02; diff --git a/src/main.rs b/src/main.rs index 1da27e4..bc49c25 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,66 +1,11 @@ -use itertools::Itertools; -use std::fs::read_to_string; +use std::env::args; + +use advent_of_rust_2024::day01; fn main() { - let input = read_to_string("input/day01.txt").unwrap(); - println!("part1: {}", part1(&input)); - println!("part2: {}", part2(&input)); -} - -type Int = i32; - -fn part1(input: &str) -> Int { - let (mut l, mut r) = make_lists(input); - - l.sort(); - r.sort(); - - l.into_iter() - .zip(r.into_iter()) - .map(|(l, r)| (l - r).abs()) - .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)] -mod test { - use crate::{part1, part2}; - - const TEST_INPUT: &str = r" -3 4 -4 3 -2 5 -1 3 -3 9 -3 3 -"; - - #[test] - fn test1() { - assert_eq!(part1(TEST_INPUT), 11); - } - #[test] - fn test2() { - assert_eq!(part2(TEST_INPUT), 31); + let day: Option = args().nth(1).and_then(|a| a.parse().ok()); + match day { + Some(1) => day01::day_main(), + _ => println!("hi"), } }