diff options
author | alyx <alyx@aleteoryx.me> | 2023-12-02 00:38:23 -0500 |
---|---|---|
committer | alyx <alyx@aleteoryx.me> | 2023-12-02 00:38:23 -0500 |
commit | cbea8d91895cd042df62a380bc672422e3837f42 (patch) | |
tree | 8753332e146b3b9e3dce79bdda0389bd14ac4fd0 /2023/rs/code/two/src/main.rs | |
parent | d021985d54af172788ff46f17bdefbe47e6dfe7d (diff) | |
download | adventofcode-cbea8d91895cd042df62a380bc672422e3837f42.tar.gz adventofcode-cbea8d91895cd042df62a380bc672422e3837f42.tar.bz2 adventofcode-cbea8d91895cd042df62a380bc672422e3837f42.zip |
2023.2
Diffstat (limited to '2023/rs/code/two/src/main.rs')
-rw-r--r-- | 2023/rs/code/two/src/main.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/2023/rs/code/two/src/main.rs b/2023/rs/code/two/src/main.rs new file mode 100644 index 0000000..3effd9a --- /dev/null +++ b/2023/rs/code/two/src/main.rs @@ -0,0 +1,61 @@ +use nom::{Parser, IResult}; +use nom::character::complete::*; +use nom::bytes::complete::*; +use nom::sequence::*; +use nom::combinator::*; +use nom::number::complete as number; +use nom::multi::*; + +struct Game { + pub id: u32, + pub rounds: Vec<Round> +} +#[derive(Default)] +struct Round { + pub red: u8, + pub green: u8, + pub blue: u8 +} + +// feck, i think nom may have been a bit too much for this. + +fn parse_game(i: &str) -> IResult<&str, Game> { + separated_pair( + preceded( + tag("Game "), + digit1.map(|s: &str| s.parse().unwrap())), + tag(": "), + separated_list1( + tag("; "), + fold_many0( + terminated( + separated_pair( + digit1.map(|s: &str| s.parse().unwrap()), + tag(" "), + alpha1), + opt(tag(", "))), + || Round::default(), + |mut r, (n, t)| match t { + "red" => {r.red = n; r}, + "green" => {r.green = n; r}, + "blue" => {r.blue = n; r}, + _ => r + }))).map(|(n, r)| Game{id: n, rounds: r}).parse(i) +} + +static INPUT: &str = include_str!("input.txt"); + +fn main() { + let valueified = INPUT.split("\n").filter(|s| !s.is_empty()).map(|g| parse_game(g).unwrap().1); + + let valid_id_sum = valueified.clone().filter(|g| !g.rounds.iter().any(|r| r.red > 12 || r.green > 13 || r.blue > 14)).map(|g| g.id).sum::<u32>(); + println!("Sum of valid IDs: {valid_id_sum}"); + + let game_power_sum = valueified.map(|g| { + let red = g.rounds.iter().map(|r| r.red).max().unwrap_or(0); + let green = g.rounds.iter().map(|r| r.green).max().unwrap_or(0); + let blue = g.rounds.iter().map(|r| r.blue).max().unwrap_or(0); + red as u32 * green as u32 * blue as u32 + }).sum::<u32>(); + println!("Sum of game powers: {game_power_sum}"); +} |