aoc-rs-2021/src/day_08/mod.rs
Jan Christian Grünhage e20149a5c4 implement day 8
2021-12-09 08:11:59 +01:00

93 lines
2.8 KiB
Rust

mod model;
mod parsing;
use aoc_runner_derive::{aoc, aoc_generator};
pub use model::{Input, Ssd};
pub use parsing::parse_input as parse_input_tokens;
use yap::IntoTokens;
#[aoc_generator(day8)]
pub fn parse_input(input: &str) -> Vec<Input> {
parse_input_tokens(&mut input.into_tokens())
}
#[aoc(day8, part1)]
pub fn part1(input: &[Input]) -> usize {
let mut trivials = 0;
for input in input {
let mut ssd = Ssd::default();
for number in &input.output_values {
match ssd.try_decode(number) {
Some('1') | Some('4') | Some('7') | Some('8') => trivials += 1,
_ => (),
}
}
}
trivials
}
#[aoc(day8, part2)]
pub fn part2(input: &[Input]) -> usize {
input
.iter()
.map(|input| {
let mut ssd = Ssd::default();
let unresolved = input.unique_combinations.clone();
for num in [2, 3, 4, 7, 6, 5].iter() {
unresolved
.iter()
.filter(|pattern| pattern.len() == *num)
.for_each(|pattern| {
ssd.try_decode(pattern).unwrap();
});
}
dbg!(&ssd);
let value: String = input
.output_values
.iter()
.map(|val| ssd.try_decode(val).unwrap())
.collect();
value.parse::<usize>().unwrap()
})
.sum()
}
#[cfg(test)]
mod test {
const EXAMPLE_INPUT: &str =
"be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce";
const RESULT_PART_1: usize = 26;
const RESULT_PART_2: usize = 61229;
#[test]
fn part1_example() {
let result = super::part1(&super::parse_input(EXAMPLE_INPUT));
assert_eq!(result, RESULT_PART_1);
}
#[test]
fn part2_example() {
let result = super::part2(&super::parse_input(EXAMPLE_INPUT));
assert_eq!(result, RESULT_PART_2);
}
#[test]
fn parse_example() {
let example = super::parse_input(EXAMPLE_INPUT);
assert_eq!(example.len(), 10);
}
}