day 6
This commit is contained in:
parent
c08646fc79
commit
7c0bc429c9
2201
input/2020/day6.txt
Normal file
2201
input/2020/day6.txt
Normal file
File diff suppressed because it is too large
Load Diff
76
src/day6.rs
Normal file
76
src/day6.rs
Normal file
@ -0,0 +1,76 @@
|
||||
use std::{iter::FromIterator, ops::BitAnd};
|
||||
|
||||
use aoc_runner_derive::aoc;
|
||||
|
||||
/// A set that can only contain b'a'..b'z';
|
||||
struct AlphabetSet(u32);
|
||||
impl AlphabetSet {
|
||||
pub fn new() -> AlphabetSet {
|
||||
AlphabetSet(0)
|
||||
}
|
||||
|
||||
pub fn insert(&mut self, b: u8) {
|
||||
self.0 |= 1 << Self::char_to_bit_index(b);
|
||||
}
|
||||
|
||||
pub fn len(&self) -> usize {
|
||||
self.0.count_ones() as usize
|
||||
}
|
||||
|
||||
fn char_to_bit_index(b: u8) -> usize {
|
||||
debug_assert!(b >= b'a' && b <= b'z');
|
||||
(b as usize - 97) & 0x1f
|
||||
}
|
||||
}
|
||||
|
||||
// Do a set intersection with another set.
|
||||
impl std::ops::BitAndAssign for AlphabetSet {
|
||||
fn bitand_assign(&mut self, rhs: AlphabetSet) {
|
||||
self.0 &= rhs.0;
|
||||
}
|
||||
}
|
||||
|
||||
impl FromIterator<u8> for AlphabetSet {
|
||||
fn from_iter<I>(iter: I) -> AlphabetSet
|
||||
where
|
||||
I: IntoIterator<Item = u8>,
|
||||
{
|
||||
let mut set = AlphabetSet::new();
|
||||
for entry in iter {
|
||||
set.insert(entry);
|
||||
}
|
||||
set
|
||||
}
|
||||
}
|
||||
|
||||
#[aoc(day6, part1)]
|
||||
pub fn solve_d6_p1(input: &str) -> usize {
|
||||
input
|
||||
.split("\n\n")
|
||||
.map(|record| {
|
||||
record
|
||||
.split('\n')
|
||||
.flat_map(|line| line.as_bytes())
|
||||
.copied()
|
||||
.collect::<AlphabetSet>()
|
||||
.len()
|
||||
})
|
||||
.sum()
|
||||
}
|
||||
|
||||
#[aoc(day6, part2)]
|
||||
pub fn solve_d6_p2(input: &str) -> usize {
|
||||
input
|
||||
.split("\n\n")
|
||||
.map(|record| {
|
||||
let mut line_iter = record
|
||||
.split('\n')
|
||||
.map(|line| line.as_bytes().iter().copied().collect::<AlphabetSet>());
|
||||
let mut group_set = line_iter.next().unwrap();
|
||||
for set in line_iter {
|
||||
group_set &= set;
|
||||
}
|
||||
group_set.len()
|
||||
})
|
||||
.sum()
|
||||
}
|
||||
@ -3,5 +3,6 @@ pub mod day2;
|
||||
pub mod day3;
|
||||
pub mod day4;
|
||||
pub mod day5;
|
||||
pub mod day6;
|
||||
|
||||
aoc_runner_derive::aoc_lib! { year = 2020 }
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user