feat: add day 1

This commit is contained in:
Xavier Morel
2024-12-02 10:23:52 +01:00
parent bfa511c139
commit 1543ad5c39
7 changed files with 195 additions and 171 deletions

68
src/bin/01.rs Normal file
View File

@@ -0,0 +1,68 @@
advent_of_code::solution!(1);
use std::collections::HashMap;
fn parse_line(input: &str) -> (u32, u32) {
let input = input
.split_whitespace()
.filter(|s| !s.is_empty())
.collect::<Vec<&str>>();
let input = input.as_slice();
match input {
[a, b] => (
a.parse::<u32>().expect("parse error"),
b.parse::<u32>().expect("parse error"),
),
_ => panic!("parse error!"),
}
}
pub fn part_one(input: &str) -> Option<u32> {
let (mut left, mut right): (Vec<_>, Vec<_>) = input
.strip_suffix("\n")
.unwrap_or(input)
.lines()
.map(parse_line)
.unzip();
left.sort();
right.sort();
left.into_iter()
.zip(right)
.map(|(a, b)| a.abs_diff(b))
.sum::<u32>()
.into()
}
pub fn part_two(input: &str) -> Option<u32> {
let (left, right): (Vec<_>, Vec<_>) = input
.strip_suffix("\n")
.unwrap_or(input)
.lines()
.map(parse_line)
.unzip();
let mut right_count: HashMap<u32, u8> = HashMap::new();
right
.iter()
.for_each(|u| *right_count.entry(*u).or_default() += 1);
left.into_iter()
.map(|c| c * *right_count.entry(c).or_default() as u32)
.sum::<u32>()
.into()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_one() {
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
assert_eq!(result, Some(11));
}
#[test]
fn test_part_two() {
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
assert_eq!(result, Some(31));
}
}

View File

@@ -106,7 +106,11 @@ fn main() {
AppArguments::Time { day, all, store } => time::handle(day, all, store),
AppArguments::Download { day } => download::handle(day),
AppArguments::Read { day } => read::handle(day),
AppArguments::Scaffold { day, download, overwrite } => {
AppArguments::Scaffold {
day,
download,
overwrite,
} => {
scaffold::handle(day, overwrite);
if download {
download::handle(day);