diff --git a/src/bin/06.rs b/src/bin/06.rs new file mode 100644 index 0000000000..889f49f --- /dev/null +++ b/src/bin/06.rs @@ -0,0 +1,49 @@ +use hashbrown::HashMap; +use itertools::Itertools; + +fn solve(input: &str, min: bool) -> String { + let mut data: HashMap<_, HashMap<_, _>> = HashMap::new(); + for line in input.lines() { + for (idx, x) in line.chars().enumerate() { + *data.entry(idx).or_default().entry(x).or_insert(0) += 1; + } + } + + if min { + data.iter() + .sorted_by_key(|(k, _)| *k) + .map(|(_, v)| *v.iter().min_by_key(|(_, v)| *v).unwrap().0) + .collect::() + } else { + data.iter() + .sorted_by_key(|(k, _)| *k) + .map(|(_, v)| *v.iter().max_by_key(|(_, v)| *v).unwrap().0) + .collect::() + } +} + +pub fn part_one(input: &str) -> Option { + Some(solve(input, false)) +} +pub fn part_two(input: &str) -> Option { + Some(solve(input, true)) +} +fn main() { + let input = &aoc::read_file("inputs", 6); + aoc::solve!(1, part_one, input); + aoc::solve!(2, part_two, input); +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_part_one() { + let input = aoc::read_file("examples", 6); + assert_eq!(part_one(&input), Some("easter".to_string())); + } + #[test] + fn test_part_two() { + let input = aoc::read_file("examples", 6); + assert_eq!(part_two(&input), Some("advent".to_string())); + } +} diff --git a/src/examples/06.txt b/src/examples/06.txt new file mode 100644 index 0000000000..32ba518 --- /dev/null +++ b/src/examples/06.txt @@ -0,0 +1,16 @@ +eedadn +drvtee +eandsr +raavrd +atevrs +tsrnev +sdttsa +rasrtv +nssdts +ntnada +svetve +tesnvt +vntsnd +vrdear +dvrsen +enarar