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