Self { map, start_pos }
}
- fn score(self: &Self, pos: (isize, isize), value: u8, visited: &mut HashSet<(isize, isize)>) -> u32 {
+ fn score(self: &Self,
+ pos: (isize, isize),
+ value: u8,
+ visited: &mut Option<HashSet<(isize, isize)>>
+ ) -> u32 {
[(-1,0), (0,1), (1,0), (0,-1)].iter()
.map(|dij| (pos.0 + dij.0 as isize, pos.1 + dij.1 as isize))
.map(|new_pos| {
match self.map.get(&new_pos) {
Some(&value_next) => {
if value_next == value + 1 {
- if value_next == b'9' && !visited.contains(&new_pos) {
- visited.insert(new_pos);
- 1
+ if value_next == b'9' {
+ match visited {
+ Some(set) => {
+ if !set.contains(&new_pos) {
+ set.insert(new_pos);
+ 1
+ }
+ else {
+ 0
+ }
+ },
+ None => 1
+ }
}
else {
self.score(new_pos, value_next, visited)
.sum()
}
- fn rating(self: &Self, pos: (isize, isize), value: u8) -> u32 {
- [(-1,0), (0,1), (1,0), (0,-1)].iter()
- .map(|dij| (pos.0 + dij.0 as isize, pos.1 + dij.1 as isize))
- .map(|new_pos| {
- match self.map.get(&new_pos) {
- Some(&value_next) => {
- if value_next == value + 1 {
- if value_next == b'9' {
- 1
- }
- else {
- self.rating(new_pos, value_next)
- }
- }
- else {
- 0
- }
- },
- _ => { 0 }
+ fn solve(self: &Self, with_rating: bool) -> u32 {
+ self.start_pos.iter()
+ .map(|pos| {
+ match with_rating {
+ true => self.score(*pos, b'0', &mut None),
+ false => {
+ let visited = HashSet::new();
+ self.score(*pos, b'0', &mut Some(visited))
+ }
}
})
.sum()
println!("Running {} - part 1", get_day());
let puzzle = Puzzle::new(input);
- let res = puzzle.start_pos.iter()
- .map(|pos| {
- let mut visited = HashSet::new();
- puzzle.score(*pos, b'0', &mut visited)
- })
- .sum();
-
- Ok(res)
+ Ok(puzzle.solve(false))
}
fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
println!("Running {} - part 2", get_day());
let puzzle = Puzzle::new(input);
- let res = puzzle.start_pos.iter()
- .map(|pos| puzzle.rating(*pos, b'0'))
- .sum();
-
- Ok(res)
+ Ok(puzzle.solve(true))
}
pub fn run(input: &str) -> Result<(), Box<dyn Error>> {