This commit is contained in:
nora 2023-12-03 12:16:33 +01:00
parent a039fddf85
commit d95881c5cf
5 changed files with 13 additions and 8 deletions

View file

@ -7,3 +7,4 @@ edition = "2021"
[dependencies] [dependencies]
nom.workspace = true nom.workspace = true
helper.workspace = true

View file

@ -1,7 +1,6 @@
use nom::{ use nom::{
branch::alt, branch::alt,
bytes::complete::tag, bytes::complete::tag,
character::complete::digit1,
combinator::{all_consuming, map}, combinator::{all_consuming, map},
multi::separated_list0, multi::separated_list0,
sequence::{preceded, tuple}, sequence::{preceded, tuple},
@ -40,16 +39,11 @@ fn parse_line(line: &str) -> (u64, Vec<Vec<(u64, Color)>>) {
map(tag("green"), |_| Color::Green), map(tag("green"), |_| Color::Green),
))(i) ))(i)
}; };
let parse_cubes = map( let parse_cubes = tuple((helper::integer, preceded(tag(" "), parse_color)));
tuple((digit1, preceded(tag(" "), parse_color))),
|(a, c)| (a.parse::<u64>().unwrap(), c),
);
let parse_round = separated_list0(tag(", "), parse_cubes); let parse_round = separated_list0(tag(", "), parse_cubes);
let parse_game = separated_list0(tag("; "), parse_round); let parse_game = separated_list0(tag("; "), parse_round);
let parse_line = tuple(( let parse_line = tuple((
map(preceded(tag("Game "), digit1), |d: &str| { preceded(tag("Game "), helper::integer),
d.parse::<u64>().unwrap()
}),
preceded(tag(": "), parse_game), preceded(tag(": "), parse_game),
)); ));

4
Cargo.lock generated
View file

@ -13,12 +13,16 @@ dependencies = [
name = "day2" name = "day2"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"helper",
"nom", "nom",
] ]
[[package]] [[package]]
name = "helper" name = "helper"
version = "0.1.0" version = "0.1.0"
dependencies = [
"nom",
]
[[package]] [[package]]
name = "memchr" name = "memchr"

View file

@ -6,3 +6,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
nom.workspace = true

View file

@ -0,0 +1,5 @@
use nom::{character::complete::digit1, combinator::map, IResult};
pub fn integer(input: &str) -> IResult<&str, u64> {
map(digit1, |d: &str| d.parse::<u64>().unwrap())(input)
}