From b9fbda80854f6fd9b70d178d90b0df63b9f833ca Mon Sep 17 00:00:00 2001 From: Tobias Berger Date: Sat, 2 Dec 2023 14:12:56 +0100 Subject: [PATCH] Rust Day 2 Part 1 optimize with early return --- rust/src/day02/part_1.rs | 55 +++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/rust/src/day02/part_1.rs b/rust/src/day02/part_1.rs index 1e4c392..e00fc84 100644 --- a/rust/src/day02/part_1.rs +++ b/rust/src/day02/part_1.rs @@ -1,5 +1,11 @@ use crate::CubeCounts; +impl CubeCounts { + const fn exceeds_limits(&self) -> bool { + self.red > 12 || self.green > 13 || self.blue > 14 + } +} + pub(crate) fn part_1(input: &'static str) -> usize { let id_sum = input .lines() @@ -11,39 +17,30 @@ pub(crate) fn part_1(input: &'static str) -> usize { let groups = game.split("; "); - let game_counts = groups - .map(|group| { - let color_counts = group.split(", "); + for group in groups { + let color_counts = group.split(", "); - let group_counts = color_counts.map(|color_count| { - let (count, color) = color_count - .split_once(' ') - .expect("Every color count should have one space"); + let group_counts = color_counts.map(|color_count| { + let (count, color) = color_count + .split_once(' ') + .expect("Every color count should have one space"); - let count = count - .parse() - .expect("Every color count should be a valid number"); + let count = count + .parse() + .expect("Every color count should be a valid number"); - match color { - "red" => CubeCounts::red(count), - "green" => CubeCounts::green(count), - "blue" => CubeCounts::blue(count), - _ => unreachable!(), - } - }); - group_counts.sum::() - }) - .reduce(|acc, cube_count| CubeCounts { - red: u16::max(acc.red, cube_count.red), - green: u16::max(acc.green, cube_count.green), - blue: u16::max(acc.blue, cube_count.blue), - }) - .expect("At least one group should exist in each game"); - if game_counts.red <= 12 && game_counts.green <= 13 && game_counts.blue <= 14 { - Some(game_id + 1) - } else { - None + match color { + "red" => CubeCounts::red(count), + "green" => CubeCounts::green(count), + "blue" => CubeCounts::blue(count), + _ => unreachable!(), + } + }); + if group_counts.sum::().exceeds_limits() { + return None; + } } + Some(game_id + 1) }) .sum(); id_sum