finish day 3 part 1
This commit is contained in:
parent
1a6b47949b
commit
d5949a3591
1 changed files with 74 additions and 59 deletions
133
src/bin/day3.rs
133
src/bin/day3.rs
|
@ -1,5 +1,5 @@
|
|||
use aoc23::prelude::*;
|
||||
use std::fmt::Display;
|
||||
use std::str::FromStr;
|
||||
|
||||
#[derive(Debug)]
|
||||
enum Item {
|
||||
|
@ -18,6 +18,7 @@ struct Number {
|
|||
|
||||
struct Grid {
|
||||
pub rows: Vec<Vec<Item>>,
|
||||
pub numbers: Vec<Number>,
|
||||
}
|
||||
|
||||
impl Grid {
|
||||
|
@ -48,74 +49,83 @@ impl Grid {
|
|||
}
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
||||
fn print(&self) {
|
||||
for row in self.rows.iter() {
|
||||
for col in row {
|
||||
match col {
|
||||
Item::Digit(_) => print!("d"),
|
||||
Item::Symbol => print!("s"),
|
||||
Item::None => print!("."),
|
||||
impl FromStr for Grid {
|
||||
type Err = BoxE;
|
||||
|
||||
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
|
||||
let mut grid = Grid {
|
||||
rows: vec![],
|
||||
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> {
|
||||
let mut grid = Grid { rows: vec![] };
|
||||
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;
|
||||
fn part1(input: String) -> Result<usize> {
|
||||
let grid: Grid = input.parse()?;
|
||||
let mut sum = 0;
|
||||
for number in numbers.iter() {
|
||||
for number in grid.numbers.iter() {
|
||||
let adjacent =
|
||||
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!(
|
||||
// "Checking number: {:?}, is part: {}\tadjacent: {:?}",
|
||||
// number.value, is_part_no, adjacent
|
||||
// );
|
||||
// ```
|
||||
if is_part_no {
|
||||
print!("{}, ", number.value);
|
||||
// print!("{}, ", number.value);
|
||||
sum += number.value;
|
||||
}
|
||||
}
|
||||
|
||||
// grid.print();
|
||||
Ok(sum)
|
||||
}
|
||||
|
@ -125,14 +135,19 @@ async fn main() -> Result<()> {
|
|||
println!("Day 3");
|
||||
println!("=====");
|
||||
let input = utils::aoc::get_puzzle_input(3).await?;
|
||||
|
||||
// ```
|
||||
// let input = "467..114..
|
||||
// ```
|
||||
//
|
||||
// ..._...... ..35..633. ......#... 617_...... .....+.58. ..592..... ......755.
|
||||
// ...$.*.... .664.598.." .to_owned();
|
||||
println!("part 1: {}", part1(input.clone())?);
|
||||
let input = "467..114..
|
||||
...*......
|
||||
..35..633.
|
||||
......#...
|
||||
617*......
|
||||
.....+.58.
|
||||
..592.....
|
||||
......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())?);
|
||||
Ok(())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue