day3 part1 done

main
Mathias Rothenhaeusler 2023-12-08 17:37:48 +01:00
parent 9dede32fdf
commit c78dd24d31
1 changed files with 32 additions and 46 deletions

View File

@ -13,57 +13,33 @@ struct Part {
impl Engine { impl Engine {
fn valid_number(&self, current_row: usize, position: usize) -> bool { fn valid_number(&self, current_row: usize, position: usize) -> bool {
if self.parts[current_row].row.get(position + 1).is_some() let search_grid: Vec<[i32; 2]> = vec![
&& !self.number_or_point(self.parts[current_row].row[position + 1]) [0, 1],
{ [0, -1],
return true; [1, 0],
} [1, 1],
if position > 0 [1, -1],
&& self.parts[current_row].row.get(position - 1).is_some() [-1, -1],
&& !self.number_or_point(self.parts[current_row].row[position - 1]) [-1, 0],
{ [-1, 1],
return true; ];
}
if self.parts.get(current_row + 1).is_some() { let result = search_grid.iter().find(|[x, y]| {
if self.parts[current_row + 1].row.get(position + 1).is_some() let x_i32 = current_row as i32 + x;
&& !self.number_or_point(self.parts[current_row + 1].row[position + 1]) let y_i32 = position as i32 + y;
{
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;
}
}
if current_row > 0 && self.parts.get(current_row - 1).is_some() { if self.parts.get(x_i32 as usize).map_or(false, |part| {
if position > 0 part.row
&& self.parts[current_row - 1].row.get(position - 1).is_some() .get(y_i32 as usize)
&& !self.number_or_point(self.parts[current_row - 1].row[position - 1]) .map_or(false, |value| !self.number_or_point(*value))
{ }) {
return true; 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 { fn number_or_point(&self, c: char) -> bool {
@ -122,6 +98,16 @@ fn part1(input: &str) -> u32 {
current_number.push(*letter); current_number.push(*letter);
} }
} }
if valid_number && !current_number.is_empty() {
let parsed = current_number.parse::<u32>().unwrap();
debug!(
"New line current number {} parsed: {}",
current_number, parsed
);
row_sum += parsed;
}
debug!("Sum: {}", row_sum); debug!("Sum: {}", row_sum);
row_sum row_sum