mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 12:50:32 +01:00
Use reusable parser wrapper more
This commit is contained in:
@@ -6,9 +6,10 @@ use nom::multi::many1;
|
|||||||
use nom::multi::separated_list1;
|
use nom::multi::separated_list1;
|
||||||
use nom::sequence::preceded;
|
use nom::sequence::preceded;
|
||||||
use nom::sequence::tuple;
|
use nom::sequence::tuple;
|
||||||
use nom::Finish;
|
|
||||||
use nom::IResult;
|
use nom::IResult;
|
||||||
|
|
||||||
|
use crate::common::read_input;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct BingoCard([(bool, u8); 25]);
|
struct BingoCard([(bool, u8); 25]);
|
||||||
|
|
||||||
@@ -80,16 +81,8 @@ fn parse_input(input: &[u8]) -> IResult<&[u8], (Vec<u8>, Vec<BingoCard>)> {
|
|||||||
tuple((parse_numbers, many1(parse_bingo)))(input)
|
tuple((parse_numbers, many1(parse_bingo)))(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input(input: &mut dyn Read) -> (Vec<u8>, Vec<BingoCard>) {
|
|
||||||
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 {
|
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 number in numbers {
|
||||||
for card in &mut bingo_cards {
|
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 {
|
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 bingo_won = vec![false; bingo_cards.len()];
|
||||||
let mut num_won = 0;
|
let mut num_won = 0;
|
||||||
let to_win = bingo_cards.len();
|
let to_win = bingo_cards.len();
|
||||||
|
|||||||
@@ -8,9 +8,10 @@ use nom::multi::many0;
|
|||||||
use nom::sequence::preceded;
|
use nom::sequence::preceded;
|
||||||
use nom::sequence::separated_pair;
|
use nom::sequence::separated_pair;
|
||||||
use nom::sequence::terminated;
|
use nom::sequence::terminated;
|
||||||
use nom::Finish;
|
|
||||||
use nom::IResult;
|
use nom::IResult;
|
||||||
|
|
||||||
|
use crate::common::read_input;
|
||||||
|
|
||||||
type Coords = (u16, u16);
|
type Coords = (u16, u16);
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
@@ -47,13 +48,6 @@ fn parse_fold(input: &[u8]) -> IResult<&[u8], Fold> {
|
|||||||
)(input)
|
)(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input(input: &mut dyn Read) -> (Vec<Coords>, Vec<Fold>) {
|
|
||||||
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<Coords>, fold: Fold) {
|
fn apply_fold(dots: &mut Vec<Coords>, fold: Fold) {
|
||||||
match fold {
|
match fold {
|
||||||
Fold::X(coord) => dots.iter_mut().for_each(|(x, _)| {
|
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 {
|
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]);
|
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 {
|
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
|
folds
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|||||||
@@ -7,9 +7,10 @@ use nom::bytes::complete::tag;
|
|||||||
use nom::combinator::map;
|
use nom::combinator::map;
|
||||||
use nom::sequence::preceded;
|
use nom::sequence::preceded;
|
||||||
use nom::sequence::separated_pair;
|
use nom::sequence::separated_pair;
|
||||||
use nom::Finish;
|
|
||||||
use nom::IResult;
|
use nom::IResult;
|
||||||
|
|
||||||
|
use crate::common::read_input;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn solve_quadratic(a: f64, b: f64, c: f64) -> Option<f64> {
|
fn solve_quadratic(a: f64, b: f64, c: f64) -> Option<f64> {
|
||||||
let d = b * b - 4. * a * c;
|
let d = b * b - 4. * a * c;
|
||||||
@@ -108,10 +109,7 @@ fn parse_input(input: &[u8]) -> IResult<&[u8], (RangeInclusive<i32>, RangeInclus
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn part1(input: &mut dyn Read) -> String {
|
pub fn part1(input: &mut dyn Read) -> String {
|
||||||
let mut buffer = Vec::new();
|
let (x_range, y_range) = read_input(input, parse_input);
|
||||||
input.read_to_end(&mut buffer).unwrap();
|
|
||||||
|
|
||||||
let (x_range, y_range) = parse_input(&buffer).finish().unwrap().1;
|
|
||||||
|
|
||||||
let check_value = |y_speed| {
|
let check_value = |y_speed| {
|
||||||
let mut time = find_hit(y_speed, &y_range)?;
|
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 {
|
pub fn part2(input: &mut dyn Read) -> String {
|
||||||
let mut buffer = Vec::new();
|
let (x_range, y_range) = read_input(input, parse_input);
|
||||||
input.read_to_end(&mut buffer).unwrap();
|
|
||||||
|
|
||||||
let (x_range, y_range) = parse_input(&buffer).finish().unwrap().1;
|
|
||||||
|
|
||||||
let num_options = |y_speed| {
|
let num_options = |y_speed| {
|
||||||
let time = find_hit(y_speed, &y_range)?;
|
let time = find_hit(y_speed, &y_range)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user