93 lines
2.8 KiB
Rust
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);
|
|
}
|
|
}
|