From 4df3715c5dde0d54eb20ac9f5181175ec3d3bc7f Mon Sep 17 00:00:00 2001 From: uku Date: Sun, 1 Dec 2024 15:25:51 +0100 Subject: [PATCH] feat(day1): init --- Cargo.lock | 16 +++++++++ Cargo.toml | 1 + src/solutions/day_01.rs | 74 +++++++++++++++++++++++++++++++++++++++++ src/solutions/mod.rs | 4 ++- 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/solutions/day_01.rs diff --git a/Cargo.lock b/Cargo.lock index 7a29374..1e60d8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,7 @@ version = "0.1.0" dependencies = [ "dotenvy", "indoc", + "itertools", "ureq", ] @@ -64,6 +65,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "flate2" version = "1.0.35" @@ -239,6 +246,15 @@ version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "libc" version = "0.2.167" diff --git a/Cargo.toml b/Cargo.toml index 68c6878..35d95d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,5 @@ edition = "2021" [dependencies] dotenvy = "0.15.7" indoc = "2.0.5" +itertools = "0.13.0" ureq = "2.11.0" diff --git a/src/solutions/day_01.rs b/src/solutions/day_01.rs new file mode 100644 index 0000000..0f1ae7a --- /dev/null +++ b/src/solutions/day_01.rs @@ -0,0 +1,74 @@ +use itertools::Itertools; + +use crate::common::{Answer, Solution}; + +pub struct Day01; + +impl Solution for Day01 { + fn name(&self) -> &'static str { + "Historian Hysteria" + } + + fn part_a(&self, input: &str) -> Answer { + let (mut left, mut right) = input + .lines() + .map(|l| l.split_once(" ").unwrap()) + .map(|(n1, n2)| (n1.parse::().unwrap(), n2.parse::().unwrap())) + .collect::<(Vec<_>, Vec<_>)>(); + + left.sort(); + right.sort(); + + let sum: i32 = left + .into_iter() + .zip(right) + .map(|(a, b)| (a - b).abs()) + .sum(); + + Answer::Number(sum as u64) + } + + fn part_b(&self, input: &str) -> Answer { + let (left, right) = input + .lines() + .map(|l| l.split_once(" ").unwrap()) + .map(|(n1, n2)| (n1.parse::().unwrap(), n2.parse::().unwrap())) + .collect::<(Vec<_>, Vec<_>)>(); + + let counts = right.into_iter().counts(); + + let sum = left + .into_iter() + .map(|n| counts.get(&n).unwrap_or(&0) * (n as usize)) + .sum::(); + + Answer::Number(sum as u64) + } +} + +#[cfg(test)] +mod test { + use super::Day01; + use crate::common::Solution; + + use indoc::indoc; + + const INPUT: &str = indoc! {" + 3 4 + 4 3 + 2 5 + 1 3 + 3 9 + 3 3 + "}; + + #[test] + fn part_a() { + assert_eq!(Day01.part_a(INPUT), 11.into()); + } + + #[test] + fn part_b() { + assert_eq!(Day01.part_b(INPUT), 31.into()); + } +} diff --git a/src/solutions/mod.rs b/src/solutions/mod.rs index 24ed351..ded8423 100644 --- a/src/solutions/mod.rs +++ b/src/solutions/mod.rs @@ -1,3 +1,5 @@ use crate::common::Solution; -pub const SOLUTIONS: &[&dyn Solution] = &[]; +mod day_01; + +pub const SOLUTIONS: &[&dyn Solution] = &[&day_01::Day01];