diff --git a/src/day6.rs b/src/day6.rs new file mode 100644 index 0000000..82c6609 --- /dev/null +++ b/src/day6.rs @@ -0,0 +1,72 @@ +use std::collections::HashSet; + +use aoc_runner_derive::{aoc, aoc_generator}; +use itertools::Itertools; + +#[aoc_generator(day6, part1)] +fn parse(input: &str) -> Vec { + input.split("\n\n") + .map(|group| { + group.chars() + .filter(|char| !char.is_ascii_whitespace()) + .collect::>().len() + }).collect_vec() +} + +#[aoc(day6, part1)] +fn part1(input: &Vec) -> usize { + input.iter().sum() +} + +#[aoc_generator(day6, part2)] +fn parse2(input: &str) -> Vec { + input.split("\n\n") + .map(|group| { + let people = group.lines().collect_vec(); + let mut first = people[0].chars().collect_vec(); + for person in &people[1..] { + first = first.iter() + .cloned() + .filter(|question| person.contains(*question)) + .collect_vec() + } + first.len() + }).collect_vec() +} + +#[aoc(day6, part2)] +fn part2(input: &Vec) -> usize { + input.iter().sum() +} + + +#[cfg(test)] +mod tests { + use super::*; + +const EX: &str = r"abc + +a +b +c + +ab +ac + +a +a +a +a + +b"; + + #[test] + fn part1_example() { + assert_eq!(part1(&parse(EX)), 11); + } + + #[test] + fn part2_example() { + assert_eq!(part2(&parse2(EX)), 6); + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index f9c2e11..b565cdc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +mod day6; mod day5; mod day1; mod day4;