day6
This commit is contained in:
parent
f1889cfccc
commit
f1d7f9dd38
2176
data/day6/input
Normal file
2176
data/day6/input
Normal file
File diff suppressed because it is too large
Load Diff
76
src/bin/day6.rs
Normal file
76
src/bin/day6.rs
Normal file
@ -0,0 +1,76 @@
|
||||
const INPUT: &str = include_str!("../../data/day6/input");
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)]
|
||||
struct Answers {
|
||||
mask: u32,
|
||||
}
|
||||
|
||||
impl Answers {
|
||||
fn parse(data: &str) -> Self {
|
||||
let data = data.trim();
|
||||
let mask = data.chars().map(|c| {
|
||||
let c = c as u32;
|
||||
assert!(c < 0x80);
|
||||
let c = c as u8;
|
||||
assert!(c >= b'a' && c <= b'z');
|
||||
let c = c - b'a';
|
||||
c
|
||||
}).fold(0, |mask, bit| {
|
||||
mask | 1 << bit
|
||||
});
|
||||
Self { mask }
|
||||
}
|
||||
|
||||
fn count(&self) -> u32 {
|
||||
self.mask.count_ones()
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::BitOr for Answers {
|
||||
type Output = Self;
|
||||
|
||||
fn bitor(self, rhs: Self) -> Self::Output {
|
||||
Self { mask: self.mask | rhs.mask }
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::BitAnd for Answers {
|
||||
type Output = Self;
|
||||
|
||||
fn bitand(self, rhs: Self) -> Self::Output {
|
||||
Self { mask: self.mask & rhs.mask }
|
||||
}
|
||||
}
|
||||
|
||||
struct Group {
|
||||
answers: Vec<Answers>,
|
||||
}
|
||||
|
||||
impl Group {
|
||||
fn parse(input: &str) -> Vec<Self> {
|
||||
input.split("\n\n").map(|block| {
|
||||
let answers = block.lines().map(Answers::parse).collect();
|
||||
Group { answers }
|
||||
}).collect()
|
||||
}
|
||||
|
||||
fn any_answered(&self) -> Answers {
|
||||
self.answers.iter().fold(Answers { mask: 0 }, |a, &b| a | b)
|
||||
}
|
||||
|
||||
fn all_answered(&self) -> Answers {
|
||||
self.answers[1..].iter().fold(self.answers[0], |a, &b| a & b)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let groups = Group::parse(INPUT);
|
||||
println!(
|
||||
"Sum of questions answered yes at least one per group: {}",
|
||||
groups.iter().map(|g| g.any_answered().count()).sum::<u32>(),
|
||||
);
|
||||
println!(
|
||||
"Sum of questions answered yes by everyone per group: {}",
|
||||
groups.iter().map(|g| g.all_answered().count()).sum::<u32>(),
|
||||
);
|
||||
}
|
Loading…
Reference in New Issue
Block a user