mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
68 lines
1.4 KiB
Rust
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);
|
|
}
|
|
}
|