feat: add day 6

This commit is contained in:
Xavier Morel
2024-11-19 17:09:12 +01:00
parent 98e6f49561
commit 3fd7e1a50e
3 changed files with 93 additions and 13 deletions

16
data/examples/06.txt Normal file
View File

@@ -0,0 +1,16 @@
eedadn
drvtee
eandsr
raavrd
atevrs
tsrnev
sdttsa
rasrtv
nssdts
ntnada
svetve
tesnvt
vntsnd
vrdear
dvrsen
enarar

View File

@@ -1,18 +1,17 @@
advent_of_code::solution!(5); advent_of_code::solution!(5);
fn get_valid_digests(prefix: &str) -> impl Iterator<Item = String> + '_ { fn get_valid_digests(prefix: &str) -> impl Iterator<Item = String> + '_ {
(1..) (1..).flat_map(move |x| {
.flat_map(move |x| { let data = format!("{}{:?}", prefix, x);
let data = format!("{}{:?}", prefix, x); let digest = format!("{:x}", md5::compute(data));
let digest = format!("{:x}", md5::compute(data)); if digest.starts_with("00000") {
if digest.starts_with("00000") { Some(digest)
Some(digest) } else {
} else { None
None }
} })
}) // .filter(|x| x.is_some())
// .filter(|x| x.is_some()) // .map(|x| x.unwrap())
// .map(|x| x.unwrap())
} }
pub fn part_one(input: &str) -> Option<String> { pub fn part_one(input: &str) -> Option<String> {
@@ -43,7 +42,7 @@ pub fn part_two(input: &str) -> Option<String> {
// println!(" - put {} in {:?} - digest {}", char_to_put, pos_nth, digest); // 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())) .filter(|s| s.iter().all(|x| x.is_some()))
.take(1) .take(1)

65
src/bin/06.rs Normal file
View File

@@ -0,0 +1,65 @@
advent_of_code::solution!(6);
use std::collections::HashMap;
fn compute_frequencies(input: &str) -> HashMap<usize, HashMap<char, usize>> {
let frequencies: HashMap<usize, HashMap<char, usize>> = 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<String> {
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::<Vec<_>>();
res.sort_by_key(|(k, _)| *k);
Some(res.into_iter().map(|(_, v)| v.unwrap()).collect::<String>())
}
pub fn part_two(input: &str) -> Option<String> {
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::<Vec<_>>();
res.sort_by_key(|(k, _)| *k);
Some(res.into_iter().map(|(_, v)| v.unwrap()).collect::<String>())
}
#[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()));
}
}