1
0
mirror of https://github.com/chylex/Advent-of-Code.git synced 2025-06-03 09:34:05 +02:00

Add 2020 - Day 6 - Part 2

This commit is contained in:
chylex 2022-02-24 20:35:05 +01:00
parent 4d73c56888
commit dec975132e
Signed by: chylex
GPG Key ID: 4DE42C8F19A80548

View File

@ -1,6 +1,6 @@
use std::collections::HashSet;
use std::error::Error; use std::error::Error;
use crate::group::Group;
use crate::utils::GenericError; use crate::utils::GenericError;
#[path = "../utils/mod.rs"] #[path = "../utils/mod.rs"]
@ -10,8 +10,10 @@ fn main() -> Result<(), Box<dyn Error>> {
let lines = utils::read_input_lines()?; let lines = utils::read_input_lines()?;
let groups = load_groups(&lines)?; let groups = load_groups(&lines)?;
let total_answers = groups.iter().map(|group| group.combined_answers.len()).sum::<usize>(); let total_answers_any_members = groups.iter().map(Group::count_answers_by_any_members).sum::<usize>();
println!("Total 'yes' answers among groups: {}", total_answers); let total_answers_all_members = groups.iter().map(Group::count_answers_by_all_members).sum::<usize>();
println!("Total 'yes' answers, counting answers by any group member: {}", total_answers_any_members);
println!("Total 'yes' answers, counting answers by all group members: {}", total_answers_all_members);
Ok(()) Ok(())
} }
@ -33,31 +35,45 @@ fn load_groups(lines: &Vec<String>) -> Result<Vec<Group>, GenericError> {
Ok(groups) Ok(groups)
} }
struct Group { mod group {
individual_answers: Vec<HashSet<char>>, use std::collections::HashSet;
combined_answers: HashSet<char>,
} use crate::GenericError;
impl Group { pub struct Group {
fn new() -> Group { individual_answers: Vec<HashSet<char>>,
Group { combined_answers: HashSet<char>,
individual_answers: Vec::new(),
combined_answers: HashSet::new(),
}
} }
fn add_individual(&mut self, answer_str: &str) -> Result<(), GenericError> { impl Group {
let answer_set = answer_str.chars().collect::<HashSet<char>>(); pub fn new() -> Group {
Group {
for answer in &answer_set { individual_answers: Vec::new(),
if answer.is_ascii_lowercase() { combined_answers: HashSet::new(),
self.combined_answers.insert(answer.clone());
} else {
return Err(GenericError::new(format!("Invalid answer: {}", answer)));
} }
} }
self.individual_answers.push(answer_set); pub fn add_individual(&mut self, answer_str: &str) -> Result<(), GenericError> {
Ok(()) let answer_set = answer_str.chars().collect::<HashSet<char>>();
for answer in &answer_set {
if answer.is_ascii_lowercase() {
self.combined_answers.insert(answer.clone());
} else {
return Err(GenericError::new(format!("Invalid answer: {}", answer)));
}
}
self.individual_answers.push(answer_set);
Ok(())
}
pub fn count_answers_by_any_members(&self) -> usize {
return self.combined_answers.len();
}
pub fn count_answers_by_all_members(&self) -> usize {
return self.combined_answers.iter().filter(|answer| self.individual_answers.iter().all(|answers| answers.contains(&answer))).count();
}
} }
} }