From d5949a359138d1de55915cffbfadfea173c58502 Mon Sep 17 00:00:00 2001 From: "RingOfStorms (Joshua Bell)" Date: Sun, 3 Dec 2023 02:28:12 -0600 Subject: [PATCH] finish day 3 part 1 --- src/bin/day3.rs | 133 +++++++++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 59 deletions(-) diff --git a/src/bin/day3.rs b/src/bin/day3.rs index 8c449cc..19f9ab3 100644 --- a/src/bin/day3.rs +++ b/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>, + pub numbers: Vec, } 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 { + let mut grid = Grid { + rows: vec![], + numbers: vec![], + }; + for (row_index, line) in s.lines().enumerate() { + let mut row: Vec = vec![]; + let mut num: Option = 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 { - let mut grid = Grid { rows: vec![] }; - let mut numbers: Vec = vec![]; - for (row_index, line) in input.lines().enumerate() { - let mut row: Vec = vec![]; - let mut num: Option = 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 { + 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(())