diff options
Diffstat (limited to '2024/04/rust/src/main.rs')
-rw-r--r-- | 2024/04/rust/src/main.rs | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/2024/04/rust/src/main.rs b/2024/04/rust/src/main.rs index f3b152c..f1f464f 100644 --- a/2024/04/rust/src/main.rs +++ b/2024/04/rust/src/main.rs @@ -11,7 +11,7 @@ fn main() -> io::Result<()> { let grid = Grid::new(grid); let silver: usize = silver(&grid); - let gold: u64 = 0; + let gold: usize = gold(&grid); println!("silver: {silver}"); println!("gold: {gold}"); @@ -25,3 +25,22 @@ fn silver(grid: &Grid<char>) -> usize { .filter(|p| *p) .count() } + +fn gold(grid: &Grid<char>) -> usize { + let xmas: Vec<(i64, i64)> = vec![(0, 0), (-1, -1), (1, -1), (-1, 1), (1, 1)]; + grid.points() + .map(move |p| { + xmas.iter() + .map(|&d| grid.move_pos(p, d.into(), 1).and_then(|p| grid.at(p))) + .collect::<Option<Vec<_>>>() + }) + .flatten() + .map(|cs| { + vec!["AMSMS", "AMMSS", "ASMSM", "ASSMM"] + .iter() + .map(|x| cs.iter().eq_by(x.chars(), |&&a, b| a == b)) + .any(|p| p) + }) + .filter(|p| *p) + .count() +} |