From 3fd7e1a50eea8d5acf0c3d4c8102b83f591434b5 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 19 Nov 2024 17:09:12 +0100 Subject: [PATCH] feat: add day 6 --- data/examples/06.txt | 16 +++++++++++ src/bin/05.rs | 25 ++++++++--------- src/bin/06.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 13 deletions(-) create mode 100644 data/examples/06.txt create mode 100644 src/bin/06.rs diff --git a/data/examples/06.txt b/data/examples/06.txt new file mode 100644 index 0000000..32ba518 --- /dev/null +++ b/data/examples/06.txt @@ -0,0 +1,16 @@ +eedadn +drvtee +eandsr +raavrd +atevrs +tsrnev +sdttsa +rasrtv +nssdts +ntnada +svetve +tesnvt +vntsnd +vrdear +dvrsen +enarar diff --git a/src/bin/05.rs b/src/bin/05.rs index e260384..4f6e5c0 100644 --- a/src/bin/05.rs +++ b/src/bin/05.rs @@ -1,18 +1,17 @@ advent_of_code::solution!(5); fn get_valid_digests(prefix: &str) -> impl Iterator + '_ { - (1..) - .flat_map(move |x| { - let data = format!("{}{:?}", prefix, x); - let digest = format!("{:x}", md5::compute(data)); - if digest.starts_with("00000") { - Some(digest) - } else { - None - } - }) - // .filter(|x| x.is_some()) - // .map(|x| x.unwrap()) + (1..).flat_map(move |x| { + let data = format!("{}{:?}", prefix, x); + let digest = format!("{:x}", md5::compute(data)); + if digest.starts_with("00000") { + Some(digest) + } else { + None + } + }) + // .filter(|x| x.is_some()) + // .map(|x| x.unwrap()) } pub fn part_one(input: &str) -> Option { @@ -43,7 +42,7 @@ pub fn part_two(input: &str) -> Option { // println!(" - put {} in {:?} - digest {}", char_to_put, pos_nth, digest); } } - Some(*state) // .clone()) + Some(*state) // .clone()) }) .filter(|s| s.iter().all(|x| x.is_some())) .take(1) diff --git a/src/bin/06.rs b/src/bin/06.rs new file mode 100644 index 0000000..4a52ace --- /dev/null +++ b/src/bin/06.rs @@ -0,0 +1,65 @@ +advent_of_code::solution!(6); + +use std::collections::HashMap; + +fn compute_frequencies(input: &str) -> HashMap> { + let frequencies: HashMap> = HashMap::new(); + input.split("\n").fold(frequencies, |mut frq, str| { + str.chars().enumerate().for_each(|(n, c)| { + let slot_frq = frq.entry(n).or_default(); + *slot_frq.entry(c).or_default() += 1; + }); + frq + }) +} + +pub fn part_one(input: &str) -> Option { + let input = input.strip_suffix("\n").unwrap_or(input); + let mut res = compute_frequencies(input) + .into_iter() + .map(|(k, v)| { + ( + k, + v.into_iter() + .max_by_key(|(_, cnt)| *cnt) + .map(|(chr, _)| chr), + ) + }) + .collect::>(); + res.sort_by_key(|(k, _)| *k); + Some(res.into_iter().map(|(_, v)| v.unwrap()).collect::()) +} + +pub fn part_two(input: &str) -> Option { + let input = input.strip_suffix("\n").unwrap_or(input); + let mut res = compute_frequencies(input) + .into_iter() + .map(|(k, v)| { + ( + k, + v.into_iter() + .min_by_key(|(_, cnt)| *cnt) + .map(|(chr, _)| chr), + ) + }) + .collect::>(); + res.sort_by_key(|(k, _)| *k); + Some(res.into_iter().map(|(_, v)| v.unwrap()).collect::()) +} + +#[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("easter".into())); + } + + #[test] + fn test_part_two() { + let result = part_two(&advent_of_code::template::read_file("examples", DAY)); + assert_eq!(result, Some("advent".into())); + } +}