summaryrefslogtreecommitdiff
path: root/2024
diff options
context:
space:
mode:
authormhsn <mail@mhsn.net>2025-08-17 14:40:52 +0100
committermhsn <mail@mhsn.net>2025-08-17 14:40:52 +0100
commitd63b65d501b9f0844dbde46037930f727bb115c6 (patch)
tree8626a88e4196add6d0c266acd3f02223e70be86a /2024
parent2c7a888c56c3f8a0dc3512076c43312cbca0430c (diff)
downloadaoc-d63b65d501b9f0844dbde46037930f727bb115c6.tar.gz
aoc-d63b65d501b9f0844dbde46037930f727bb115c6.zip
rust 2024 06: brute force p2
Diffstat (limited to '2024')
-rw-r--r--2024/06/rust/src/main.rs43
1 files changed, 31 insertions, 12 deletions
diff --git a/2024/06/rust/src/main.rs b/2024/06/rust/src/main.rs
index 550e99e..ca78bcd 100644
--- a/2024/06/rust/src/main.rs
+++ b/2024/06/rust/src/main.rs
@@ -1,5 +1,7 @@
+use std::collections::HashSet;
use std::{collections::HashMap, io};
+#[derive(Clone)]
enum Cell {
Empty,
Obstacle,
@@ -37,7 +39,7 @@ impl Direction {
fn main() -> io::Result<()> {
let mut map = HashMap::new();
- let mut pos = None;
+ let mut start = None;
io::stdin()
.lines()
.flatten()
@@ -54,33 +56,50 @@ fn main() -> io::Result<()> {
}
'^' => {
map.insert((x, y), Cell::Empty);
- pos = Some((x, y))
+ start = Some((x, y))
}
'#' => {
map.insert((x, y), Cell::Obstacle);
}
_ => panic!(),
});
+ let start = start.unwrap();
+
+ let visited = path_len(&map, start.clone()).unwrap();
+ let silver: usize = visited.len();
+ let gold: usize = visited
+ .iter()
+ .filter(|&p| {
+ let mut map = map.clone();
+ map.insert(*p, Cell::Obstacle);
+ path_len(&map, start.clone()).is_none()
+ })
+ .count();
+ println!("silver: {silver}");
+ println!("gold: {gold}");
+
+ return Ok(());
+}
+fn path_len(
+ map: &HashMap<(isize, isize), Cell>,
+ mut pos: (isize, isize),
+) -> Option<HashSet<(isize, isize)>> {
let mut visited = HashMap::new();
- let mut pos = pos.unwrap();
let mut dir = Direction::U;
loop {
- *visited.entry(pos).or_insert(0 as u8) |= dir.clone() as u8;
+ let before = visited.entry(pos).or_insert(0 as u8);
+ if *before & dir.clone() as u8 > 0 {
+ return None;
+ }
+ *before |= dir.clone() as u8;
let ahead = dir.shift(pos);
match map.get(&ahead) {
Some(Cell::Empty) => pos = ahead,
Some(Cell::Obstacle) => dir = dir.rotate(),
- None => break,
+ None => return Some(visited.into_keys().collect()),
};
}
-
- let silver: usize = visited.len();
- let gold: usize = 0;
- println!("silver: {silver}");
- println!("gold: {gold}");
-
- return Ok(());
}