Files
adventofcode/2020/src/day06.rs
2020-12-07 09:35:41 +01:00

68 lines
1.4 KiB
Rust

use std::io::Read;
use crate::common::read_single_input;
use crate::Solution;
type Answers = u32;
fn count(answers: Answers) -> u32 {
answers.count_ones()
}
fn compute_answers(group: &str) -> Answers {
group
.chars()
.filter(char::is_ascii_lowercase)
.map(|q| 1 << (q as usize - 'a' as usize))
.fold(0, |a, b| a | b)
}
fn count_answers_all(group: &str) -> u32 {
let combined = group
.lines()
.map(compute_answers)
.fold(0xffff_ffff, |a, b| a & b);
count(combined)
}
#[derive(Default)]
pub struct Day06;
impl Solution for Day06 {
fn part1(&mut self, input: &mut dyn Read) -> String {
let input: String = read_single_input(input);
let total: u32 = input.split("\n\n").map(|g| count(compute_answers(g))).sum();
total.to_string()
}
fn part2(&mut self, input: &mut dyn Read) -> String {
let input: String = read_single_input(input);
let total: u32 = input.split("\n\n").map(count_answers_all).sum();
total.to_string()
}
}
#[cfg(test)]
mod tests {
use crate::test_implementation;
use super::*;
const SAMPLE: &[u8] = include_bytes!("../samples/06.txt");
#[test]
fn sample_part1() {
test_implementation!(Day06, 1, SAMPLE, 11);
}
#[test]
fn sample_part2() {
test_implementation!(Day06, 2, SAMPLE, 6);
}
}