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

38 lines
1 KiB
Rust

use crate::parsing::{newline, space};
use yap::Tokens;
use super::Input;
pub fn parse_input_line(tokens: &mut impl Tokens<Item = char>) -> Option<Input> {
let unique_combinations: Vec<String> = tokens
.sep_by(|t| parse_ssd_combo(t), |t| space(t))
.collect();
tokens.tokens(" | ".chars());
let output_values: Vec<String> = tokens
.sep_by(|t| parse_ssd_combo(t), |t| space(t))
.collect();
if unique_combinations.len() == 10 && output_values.len() == 4 {
Some(super::Input {
output_values,
unique_combinations,
})
} else {
None
}
}
pub fn parse_ssd_combo(tokens: &mut impl Tokens<Item = char>) -> Option<String> {
let val: String = tokens.tokens_while(|t| "abcdefg".contains(*t)).collect();
if val.is_empty() {
None
} else {
Some(val)
}
}
pub fn parse_input(tokens: &mut impl Tokens<Item = char>) -> Vec<Input> {
tokens
.sep_by(|t| parse_input_line(t), |t| newline(t))
.collect()
}