day18 simplification. No subtraction of division necessary

This commit is contained in:
Glenn Griffin 2020-12-18 16:31:35 -08:00
parent 40b618593f
commit 62601e0782

View File

@ -4,7 +4,7 @@ use nom::bytes::complete::tag;
use nom::character::complete::{char, digit1, space0}; use nom::character::complete::{char, digit1, space0};
use nom::combinator::map_res; use nom::combinator::map_res;
use nom::multi::fold_many0; use nom::multi::fold_many0;
use nom::sequence::{delimited, pair}; use nom::sequence::{delimited, preceded};
use nom::IResult; use nom::IResult;
use std::str::FromStr; use std::str::FromStr;
@ -20,32 +20,18 @@ fn num_or_paren_expr(i: &str) -> IResult<&str, usize> {
alt((num, paren_expr))(i) alt((num, paren_expr))(i)
} }
fn add_or_sub(i: &str) -> IResult<&str, usize> { fn add_or_paren(i: &str) -> IResult<&str, usize> {
let (i, lhs) = num_or_paren_expr(i)?; let (i, lhs) = num_or_paren_expr(i)?;
fold_many0( fold_many0(preceded(char('+'), num_or_paren_expr), lhs, |lhs, rhs| {
pair(alt((char('+'), char('-'))), num_or_paren_expr), lhs + rhs
lhs, })(i)
|lhs, (op, rhs)| match op {
'+' => lhs + rhs,
'-' => lhs - rhs,
_ => unreachable!("invalid op"),
},
)(i)
} }
fn expr(i: &str) -> IResult<&str, usize> { fn expr(i: &str) -> IResult<&str, usize> {
let (i, lhs) = add_or_sub(i)?; let (i, lhs) = add_or_paren(i)?;
fold_many0( fold_many0(preceded(char('*'), add_or_paren), lhs, |lhs, rhs| lhs * rhs)(i)
pair(alt((char('*'), char('/'))), add_or_sub),
lhs,
|lhs, (op, rhs)| match op {
'*' => lhs * rhs,
'/' => lhs / rhs,
_ => unreachable!("invalid op"),
},
)(i)
} }
#[aoc(day18, part1)] #[aoc(day18, part1)]