From 61559271c85f301640a782a1cbd23e6c04e46d93 Mon Sep 17 00:00:00 2001 From: Wesley Moore Date: Fri, 9 Dec 2022 19:29:11 +1000 Subject: [PATCH] Day 9 part 2 --- 2022/src/bin/day9.rs | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/2022/src/bin/day9.rs b/2022/src/bin/day9.rs index f2d2a78..d0b946c 100644 --- a/2022/src/bin/day9.rs +++ b/2022/src/bin/day9.rs @@ -14,11 +14,10 @@ fn main() -> Result<(), Box> { fn part1(input: &str) -> Result<(), Box> { let mut tail_visited = HashSet::new(); - let mut head = (0, 0); - let mut tail = (0, 0); + let mut knots = [(0, 0); 2]; for line in input.lines() { - execute(line, &mut head, &mut tail, &mut tail_visited)?; + execute(line, &mut knots, &mut tail_visited)?; } println!("Part 1: tail visited {} positions", tail_visited.len()); @@ -27,13 +26,21 @@ fn part1(input: &str) -> Result<(), Box> { } fn part2(input: &str) -> Result<(), Box> { + let mut tail_visited = HashSet::new(); + let mut knots = [(0, 0); 10]; + + for line in input.lines() { + execute(line, &mut knots, &mut tail_visited)?; + } + + println!("Part 2: tail visited {} positions", tail_visited.len()); + Ok(()) } fn execute( line: &str, - head: &mut Pos, - tail: &mut Pos, + knots: &mut [Pos], visited: &mut HashSet, ) -> Result<(), Box> { // let h = *head; @@ -48,15 +55,17 @@ fn execute( Some(("R", count)) => ((1, 0), count), _ => Err(format!("invalid line: '{}'", line))?, }; - (0..count).for_each(|_| do_move(delta, head, tail, visited)); + (0..count).for_each(|_| do_move(delta, knots, visited)); // println!("{}: H{:?} T{:?} -> H{:?} T{:?}", line, h, t, head, tail); Ok(()) } -fn do_move(delta: Pos, head: &mut Pos, tail: &mut Pos, visited: &mut HashSet) { - *head = add(*head, delta); - *tail = move_tail(*head, *tail); - visited.insert(*tail); +fn do_move(delta: Pos, knots: &mut [Pos], visited: &mut HashSet) { + knots[0] = add(knots[0], delta); + for i in 1..knots.len() { + knots[i] = move_tail(knots[i - 1], knots[i]); + } + visited.insert(*knots.last().unwrap()); } fn move_tail(head: Pos, tail: Pos) -> Pos {