[2018][rust][15.1] Unit::reachable
diff --git a/2018/rust/src/bin/day_15.rs b/2018/rust/src/bin/day_15.rs
index c3d556b..5663c25 100644
--- a/2018/rust/src/bin/day_15.rs
+++ b/2018/rust/src/bin/day_15.rs
@@ -30,9 +30,8 @@ impl Map {
fn open_neighbors(&self, square: &Square) -> HashSet<Square> {
square
.neighbors()
- .iter()
+ .into_iter()
.filter(|x| self.is_open(x))
- .map(|&x| x)
.collect()
}
@@ -57,13 +56,15 @@ impl Map {
let mut distances = HashMap::new();
let mut queue = BinaryHeap::new();
- queue.push(State{distance: 0, square: *from});
+ queue.push(State {
+ distance: 0,
+ square: *from,
+ });
- while let Some(State {distance, square}) = queue.pop() {
+ while let Some(State { distance, square }) = queue.pop() {
distances.entry(square).or_insert(distance);
- self
- .open_neighbors(&square)
+ self.open_neighbors(&square)
.iter()
.filter(|x| !distances.contains_key(x))
.map(|&x| State {
@@ -215,6 +216,14 @@ impl Unit {
.flat_map(|x| map.open_neighbors(x))
.collect()
}
+
+ fn reachable(&self, square: &Square, map: &Map) -> HashSet<Square> {
+ let distances = map.distances(square);
+ self.in_range(&map)
+ .into_iter()
+ .filter(|x| distances.contains_key(x))
+ .collect()
+ }
}
#[test]
@@ -245,6 +254,13 @@ fn test_unit_targets() {
.iter()
.map(|&x| Square(x))
.all(|x| in_range.contains(&x)));
+
+ let reachable = unit.reachable(&square, &map);
+ assert_eq!(reachable.len(), 4);
+ assert!(vec![(1, 3), (2, 2), (3, 1), (3, 3)]
+ .iter()
+ .map(|&x| Square(x))
+ .all(|x| reachable.contains(&x)));
}
#[derive(Debug, Eq, PartialEq)]