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 {
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
});
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::<u32>().unwrap();
debug!(
"New line current number {} parsed: {}",
current_number, parsed
);
row_sum += parsed;
}
debug!("Sum: {}", row_sum);
row_sum