summaryrefslogtreecommitdiff
path: root/2024/04/rust
diff options
context:
space:
mode:
Diffstat (limited to '2024/04/rust')
-rw-r--r--2024/04/rust/src/main.rs21
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()
+}