From ba1b7b693e90f2b1b403244c4358f51fcbbcc9af Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 18 Dec 2021 14:54:05 +0100 Subject: [PATCH] Use reusable parser wrapper more --- 2021/src/day04.rs | 15 ++++----------- 2021/src/day13.rs | 14 ++++---------- 2021/src/day17.rs | 13 ++++--------- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/2021/src/day04.rs b/2021/src/day04.rs index 0b6b479..6a959d3 100644 --- a/2021/src/day04.rs +++ b/2021/src/day04.rs @@ -6,9 +6,10 @@ use nom::multi::many1; use nom::multi::separated_list1; use nom::sequence::preceded; use nom::sequence::tuple; -use nom::Finish; use nom::IResult; +use crate::common::read_input; + #[derive(Debug)] struct BingoCard([(bool, u8); 25]); @@ -80,16 +81,8 @@ fn parse_input(input: &[u8]) -> IResult<&[u8], (Vec, Vec)> { tuple((parse_numbers, many1(parse_bingo)))(input) } -fn read_input(input: &mut dyn Read) -> (Vec, Vec) { - let mut buffer = Vec::new(); - - input.read_to_end(&mut buffer).unwrap(); - - parse_input(&buffer).finish().unwrap().1 -} - pub fn part1(input: &mut dyn Read) -> String { - let (numbers, mut bingo_cards) = read_input(input); + let (numbers, mut bingo_cards) = read_input(input, parse_input); for number in numbers { for card in &mut bingo_cards { @@ -103,7 +96,7 @@ pub fn part1(input: &mut dyn Read) -> String { } pub fn part2(input: &mut dyn Read) -> String { - let (numbers, mut bingo_cards) = read_input(input); + let (numbers, mut bingo_cards) = read_input(input, parse_input); let mut bingo_won = vec![false; bingo_cards.len()]; let mut num_won = 0; let to_win = bingo_cards.len(); diff --git a/2021/src/day13.rs b/2021/src/day13.rs index 90a38dd..04f0a8a 100644 --- a/2021/src/day13.rs +++ b/2021/src/day13.rs @@ -8,9 +8,10 @@ use nom::multi::many0; use nom::sequence::preceded; use nom::sequence::separated_pair; use nom::sequence::terminated; -use nom::Finish; use nom::IResult; +use crate::common::read_input; + type Coords = (u16, u16); #[derive(Copy, Clone)] @@ -47,13 +48,6 @@ fn parse_fold(input: &[u8]) -> IResult<&[u8], Fold> { )(input) } -fn read_input(input: &mut dyn Read) -> (Vec, Vec) { - let mut input_buffer = Vec::new(); - input.read_to_end(&mut input_buffer).unwrap(); - - parse_input(&input_buffer).finish().unwrap().1 -} - fn apply_fold(dots: &mut Vec, fold: Fold) { match fold { Fold::X(coord) => dots.iter_mut().for_each(|(x, _)| { @@ -88,7 +82,7 @@ fn print_dots(dots: &[Coords]) -> String { } pub fn part1(input: &mut dyn Read) -> String { - let (mut dots, folds) = read_input(input); + let (mut dots, folds) = read_input(input, parse_input); apply_fold(&mut dots, folds[0]); @@ -98,7 +92,7 @@ pub fn part1(input: &mut dyn Read) -> String { } pub fn part2(input: &mut dyn Read) -> String { - let (mut dots, folds) = read_input(input); + let (mut dots, folds) = read_input(input, parse_input); folds .into_iter() diff --git a/2021/src/day17.rs b/2021/src/day17.rs index 3df1db1..aed5ec5 100644 --- a/2021/src/day17.rs +++ b/2021/src/day17.rs @@ -7,9 +7,10 @@ use nom::bytes::complete::tag; use nom::combinator::map; use nom::sequence::preceded; use nom::sequence::separated_pair; -use nom::Finish; use nom::IResult; +use crate::common::read_input; + #[inline] fn solve_quadratic(a: f64, b: f64, c: f64) -> Option { let d = b * b - 4. * a * c; @@ -108,10 +109,7 @@ fn parse_input(input: &[u8]) -> IResult<&[u8], (RangeInclusive, RangeInclus } pub fn part1(input: &mut dyn Read) -> String { - let mut buffer = Vec::new(); - input.read_to_end(&mut buffer).unwrap(); - - let (x_range, y_range) = parse_input(&buffer).finish().unwrap().1; + let (x_range, y_range) = read_input(input, parse_input); let check_value = |y_speed| { let mut time = find_hit(y_speed, &y_range)?; @@ -127,10 +125,7 @@ pub fn part1(input: &mut dyn Read) -> String { } pub fn part2(input: &mut dyn Read) -> String { - let mut buffer = Vec::new(); - input.read_to_end(&mut buffer).unwrap(); - - let (x_range, y_range) = parse_input(&buffer).finish().unwrap().1; + let (x_range, y_range) = read_input(input, parse_input); let num_options = |y_speed| { let time = find_hit(y_speed, &y_range)?;