From c78dd24d318aa4af8f2f309157436a820660bbaa Mon Sep 17 00:00:00 2001 From: mace Date: Fri, 8 Dec 2023 17:37:48 +0100 Subject: [PATCH] day3 part1 done --- src/day3/mod.rs | 78 ++++++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/src/day3/mod.rs b/src/day3/mod.rs index 534943a..7994b64 100644 --- a/src/day3/mod.rs +++ b/src/day3/mod.rs @@ -13,57 +13,33 @@ struct Part { impl Engine { fn valid_number(&self, current_row: usize, position: usize) -> bool { - if self.parts[current_row].row.get(position + 1).is_some() - && !self.number_or_point(self.parts[current_row].row[position + 1]) - { - return true; - } - if position > 0 - && self.parts[current_row].row.get(position - 1).is_some() - && !self.number_or_point(self.parts[current_row].row[position - 1]) - { - return true; - } + let search_grid: Vec<[i32; 2]> = vec![ + [0, 1], + [0, -1], + [1, 0], + [1, 1], + [1, -1], + [-1, -1], + [-1, 0], + [-1, 1], + ]; - if self.parts.get(current_row + 1).is_some() { - if self.parts[current_row + 1].row.get(position + 1).is_some() - && !self.number_or_point(self.parts[current_row + 1].row[position + 1]) - { - return true; - } - if self.parts[current_row + 1].row.get(position).is_some() - && !self.number_or_point(self.parts[current_row + 1].row[position]) - { - return true; - } - if position > 0 - && self.parts[current_row + 1].row.get(position - 1).is_some() - && !self.number_or_point(self.parts[current_row + 1].row[position - 1]) - { - return true; - } - } + let result = search_grid.iter().find(|[x, y]| { + let x_i32 = current_row as i32 + x; + let y_i32 = position as i32 + y; - if current_row > 0 && self.parts.get(current_row - 1).is_some() { - if position > 0 - && self.parts[current_row - 1].row.get(position - 1).is_some() - && !self.number_or_point(self.parts[current_row - 1].row[position - 1]) - { + if self.parts.get(x_i32 as usize).map_or(false, |part| { + part.row + .get(y_i32 as usize) + .map_or(false, |value| !self.number_or_point(*value)) + }) { return true; } - if self.parts[current_row - 1].row.get(position + 1).is_some() - && !self.number_or_point(self.parts[current_row - 1].row[position + 1]) - { - return true; - } - if self.parts[current_row - 1].row.get(position).is_some() - && !self.number_or_point(self.parts[current_row - 1].row[position]) - { - return true; - } - } - false + false + }); + + result.is_some() } fn number_or_point(&self, c: char) -> bool { @@ -122,6 +98,16 @@ fn part1(input: &str) -> u32 { current_number.push(*letter); } } + + if valid_number && !current_number.is_empty() { + let parsed = current_number.parse::().unwrap(); + debug!( + "New line current number {} parsed: {}", + current_number, parsed + ); + row_sum += parsed; + } + debug!("Sum: {}", row_sum); row_sum