day3 part1 done
parent
9dede32fdf
commit
c78dd24d31
|
@ -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::<u32>().unwrap();
|
||||
debug!(
|
||||
"New line current number {} parsed: {}",
|
||||
current_number, parsed
|
||||
);
|
||||
row_sum += parsed;
|
||||
}
|
||||
|
||||
debug!("Sum: {}", row_sum);
|
||||
|
||||
row_sum
|
||||
|
|
Loading…
Reference in New Issue