finish day 3 part 1

This commit is contained in:
RingOfStorms (Joshua Bell) 2023-12-03 02:28:12 -06:00
parent 1a6b47949b
commit d5949a3591

View file

@ -1,5 +1,5 @@
use aoc23::prelude::*; use aoc23::prelude::*;
use std::fmt::Display; use std::str::FromStr;
#[derive(Debug)] #[derive(Debug)]
enum Item { enum Item {
@ -18,6 +18,7 @@ struct Number {
struct Grid { struct Grid {
pub rows: Vec<Vec<Item>>, pub rows: Vec<Vec<Item>>,
pub numbers: Vec<Number>,
} }
impl Grid { impl Grid {
@ -48,74 +49,83 @@ impl Grid {
} }
return items; return items;
} }
}
fn print(&self) { impl FromStr for Grid {
for row in self.rows.iter() { type Err = BoxE;
for col in row {
match col { fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
Item::Digit(_) => print!("d"), let mut grid = Grid {
Item::Symbol => print!("s"), rows: vec![],
Item::None => print!("."), numbers: vec![],
};
for (row_index, line) in s.lines().enumerate() {
let mut row: Vec<Item> = vec![];
let mut num: Option<usize> = None;
let mut char_start = 0;
for (char_index, char) in line.trim().chars().enumerate() {
if let Some(digit) = char.to_digit(10) {
row.push(Item::Digit(digit));
num = if let Some(existing_num) = num {
Some(existing_num * 10 + digit as usize)
} else {
char_start = char_index;
Some(digit as usize)
};
} else {
if char == '.' {
// println!("Ended number seq, hit dot after {:?} {}", num, char);
row.push(Item::None);
} else {
// println!("Ended number seq, hit symbol after {:?} {}", num, char);
row.push(Item::Symbol)
}
if let Some(value) = num {
grid.numbers.push(Number {
value,
row_index,
char_start,
char_end: char_index - 1,
});
num = None;
char_start = 0;
}
} }
} }
println!(); if let Some(value) = num {
grid.numbers.push(Number {
value,
row_index,
char_start,
char_end: line.len() - 1,
});
}
grid.rows.push(row);
} }
Ok(grid)
} }
} }
fn part1(input: String) -> Result<impl Display> { fn part1(input: String) -> Result<usize> {
let mut grid = Grid { rows: vec![] }; let grid: Grid = input.parse()?;
let mut numbers: Vec<Number> = vec![];
for (row_index, line) in input.lines().enumerate() {
let mut row: Vec<Item> = vec![];
let mut num: Option<usize> = None;
let mut char_start = 0;
for (char_index, char) in line.trim().chars().enumerate() {
if let Some(digit) = char.to_digit(10) {
row.push(Item::Digit(digit));
num = if let Some(existing_num) = num {
Some(existing_num * 10 + digit as usize)
} else {
char_start = char_index;
Some(digit as usize)
};
} else {
if char == '.' {
// println!("Ended number seq, hit dot after {:?} {}", num, char);
row.push(Item::None);
} else {
// println!("Ended number seq, hit symbol after {:?} {}", num, char);
row.push(Item::Symbol)
}
if let Some(value) = num {
numbers.push(Number {
value,
row_index,
char_start,
char_end: char_index - 1,
});
num = None;
char_start = 0;
}
}
}
grid.rows.push(row);
}
let grid = grid;
let mut sum = 0; let mut sum = 0;
for number in numbers.iter() { for number in grid.numbers.iter() {
let adjacent = let adjacent =
grid.get_adjacent_items(number.row_index, number.char_start, number.char_end); grid.get_adjacent_items(number.row_index, number.char_start, number.char_end);
let is_part_no = adjacent.iter().any(|item| !matches!(item, Item::None)); let is_part_no = adjacent.iter().any(|item| matches!(item, Item::Symbol));
// ```
// println!( // println!(
// "Checking number: {:?}, is part: {}\tadjacent: {:?}", // "Checking number: {:?}, is part: {}\tadjacent: {:?}",
// number.value, is_part_no, adjacent // number.value, is_part_no, adjacent
// ); // );
// ```
if is_part_no { if is_part_no {
print!("{}, ", number.value); // print!("{}, ", number.value);
sum += number.value; sum += number.value;
} }
} }
// grid.print(); // grid.print();
Ok(sum) Ok(sum)
} }
@ -125,14 +135,19 @@ async fn main() -> Result<()> {
println!("Day 3"); println!("Day 3");
println!("====="); println!("=====");
let input = utils::aoc::get_puzzle_input(3).await?; let input = utils::aoc::get_puzzle_input(3).await?;
let input = "467..114..
// ``` ...*......
// let input = "467..114.. ..35..633.
// ``` ......#...
// 617*......
// ..._...... ..35..633. ......#... 617_...... .....+.58. ..592..... ......755. .....+.58.
// ...$.*.... .664.598.." .to_owned(); ..592.....
println!("part 1: {}", part1(input.clone())?); ......755.
...$.*....
.664.598.."
.to_owned();
let part_1 = part1(input.clone())?;
println!("part 1: {} == 520019 !! {}", part_1, part_1 == 520019);
// println!("part 2: {}", part2(input.clone())?); // println!("part 2: {}", part2(input.clone())?);
Ok(()) Ok(())