diff --git a/2024/04/p1/main.rs b/2024/04/p1/main.rs index 71c9eef..a596547 100644 --- a/2024/04/p1/main.rs +++ b/2024/04/p1/main.rs @@ -1,4 +1,4 @@ -use std::{fs::File, io::Read}; +use std::{fs::File, io::Read, time::Instant}; fn main() -> std::io::Result<()> { let args: Vec<_> = std::env::args().collect(); @@ -8,40 +8,16 @@ fn main() -> std::io::Result<()> { let mut file = File::open(filename)?; file.read_to_string(&mut contents)?; + let a = Instant::now(); + let lines: Vec<_> = contents.lines().collect(); - // let height = lines.len(); - // let width = lines[0].len(); - // let res_buf: Vec> = (0..height) - // .map(|_| (0..width).map(|_| '.').collect()) - // .collect(); - // _ = &res_buf; - - print_res( - &lines - .iter() - .map(|ln| ln.chars().collect::>()) - .collect::>(), - ); - - // let r = eq_in_dir( - // &lines - // .iter() - // .map(|ln| ln.chars().collect::>()) - // .collect::>(), - // (4, 0), - // (1, 1), - // "MAS".chars(), - // ); - // println!("{r:?}"); - // return Ok(()); - let mut t = 0; for (i, ln) in lines.iter().enumerate() { for (j, ch) in ln.chars().enumerate() { if ch == 'X' { - // println!("X found at ({j}, {i})"); let map = [-1, 0, 1].map(|i| [-1, 0, 1].map(|j| (i, j))); for dir in map.as_flattened() { + if dir.0 == 0 && dir.1 == 0 { continue; } let r = eq_in_dir( &lines .iter() @@ -51,14 +27,17 @@ fn main() -> std::io::Result<()> { *dir, "MAS".chars(), ); - if r { t += 1; } - // println!(" {dir:?}: {r:?}"); + if r { + t += 1; + } } } } } - println!("total {t}"); + let b = Instant::now(); + + println!("total {t} in {:?}", b - a); Ok(()) } @@ -77,18 +56,14 @@ fn opt_eq_in_dir( dir: (isize, isize), mut matches: impl Iterator, ) -> Option<()> { - - // println!(" {pos:?} {dir:?}"); let Some(must_match) = matches.next() else { return Some(()); }; - // println!(" {must_match:?}"); let new_1 = do_the_thing(dir.1, pos.1)?; let new_0 = do_the_thing(dir.0, pos.0)?; let ln = buf.get(new_1)?; let ch = ln.get(new_0)?; - // println!(" {ch:?}"); if must_match == *ch { opt_eq_in_dir(buf, (new_0, new_1), dir, matches) @@ -97,6 +72,7 @@ fn opt_eq_in_dir( } } +#[inline] fn do_the_thing(a: isize, b: usize) -> Option { let r = b as isize + a; if r < 0 { @@ -104,9 +80,3 @@ fn do_the_thing(a: isize, b: usize) -> Option { } Some(r as usize) } - -fn print_res(buf: &[Vec]) { - for ln in buf.iter() { - println!("{}", ln.iter().collect::()) - } -}