From 00000060b5e3e0cec3012f1058e2338dd2963770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Jane=C5=BEi=C4=8D?= Date: Sat, 2 Dec 2023 06:43:58 +0100 Subject: [PATCH] solution: day 2 --- data/examples/02.txt | 6 +++ src/bin/02.rs | 100 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 data/examples/02.txt create mode 100644 src/bin/02.rs diff --git a/data/examples/02.txt b/data/examples/02.txt new file mode 100644 index 000000000..a997cf6 --- /dev/null +++ b/data/examples/02.txt @@ -0,0 +1,6 @@ +Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green +Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue +Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red +Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red +Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green + diff --git a/src/bin/02.rs b/src/bin/02.rs new file mode 100644 index 000000000..e1706c1 --- /dev/null +++ b/src/bin/02.rs @@ -0,0 +1,100 @@ +use std::str::FromStr; + +use aoc::parsers::to_vec; + +struct Game { + id: u32, + balls: Vec<(u32, String)>, +} + +impl FromStr for Game { + type Err = String; + fn from_str(s: &str) -> Result { + let rest = s.strip_prefix("Game ").unwrap(); + let (id, rest) = rest.split_once(':').unwrap(); + let id = id.parse().unwrap(); + + let balls = rest + .split([',', ';']) + .map(|x| x.strip_prefix(' ').unwrap().split_once(' ').unwrap()) + .map(|(n, c)| (n.parse::().unwrap(), c.to_string())) + .collect(); + + Ok(Game { id, balls }) + } +} + +pub fn part_one(input: &str) -> Option { + let games: Vec = to_vec(input, '\n'); + + let mut id_sum = 0; + + 'games: for g in games { + for (n, c) in g.balls { + match c.as_str() { + "blue" => { + if n > 14 { + continue 'games; + } + } + "red" => { + if n > 12 { + continue 'games; + } + } + "green" => { + if n > 13 { + continue 'games; + } + } + _ => continue 'games, + } + } + + id_sum += g.id; + } + + Some(id_sum) +} + +pub fn part_two(input: &str) -> Option { + let games: Vec = to_vec(input, '\n'); + + let mut total_power = 0; + + for g in games { + let power: u32 = ["blue", "red", "green"] + .iter() + .map(|&c| { + g.balls + .iter() + .filter(|(_, cd)| c == cd.as_str()) + .map(|(n, _)| n) + .max() + .unwrap() + }) + .product(); + + total_power += power; + } + + Some(total_power) +} + +aoc::solution!(2); + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_part_one() { + assert_eq!(part_one(&aoc::template::read_file("examples", 2)), Some(8)); + } + #[test] + fn test_part_two() { + assert_eq!( + part_two(&aoc::template::read_file("examples", 2)), + Some(2286) + ); + } +}