From 0c183b316e04530a2f0f9a577e1e8e0ffa0a7f8b Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sun, 18 Dec 2022 21:31:02 +0100 Subject: [PATCH] Refactor common code out --- 2022/src/day17.rs | 51 +++++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/2022/src/day17.rs b/2022/src/day17.rs index 1d9faf5..9ce0f0e 100644 --- a/2022/src/day17.rs +++ b/2022/src/day17.rs @@ -29,6 +29,22 @@ fn print_cavern(cavern: &IndexSet, max_height: usize) { } } +fn collides(shape: &[&[bool]], cavern: &IndexSet, x: usize, y: usize) -> bool { + for (row, line) in shape.iter().enumerate() { + if x + line.len() > WIDTH { + return true; + } + + for (col, &on) in line.iter().enumerate() { + if on && cavern.contains((y - row) * WIDTH + x + col) { + return true; + } + } + } + + false +} + pub fn part1(input: &[u8]) -> Result { // Poor man's trim() let input = if input[input.len() - 1] == b'\n' { @@ -50,25 +66,9 @@ pub fn part1(input: &[u8]) -> Result { let mut y = max_height + shape.len() + 2; // Acquire gust of wind - 'falling: for offset in gusts.by_ref() { + for offset in gusts.by_ref() { if let Some(nx) = x.checked_add_signed(offset) { - let mut should_move = true; - - 'collision: for (row, line) in shape.iter().enumerate() { - if nx + line.len() > WIDTH { - should_move = false; - break 'collision; - } - - for (col, &on) in line.iter().enumerate() { - if on && cavern.contains((y - row) * WIDTH + nx + col) { - should_move = false; - break 'collision; - } - } - } - - if should_move { + if !collides(shape, &cavern, nx, y) { x = nx; } } else { @@ -76,19 +76,10 @@ pub fn part1(input: &[u8]) -> Result { } // Move down if possible - if y >= shape.len() { - let ny = y - 1; - for (row, line) in shape.iter().enumerate() { - // No width check, should not hit that on the way down. - for (col, &on) in line.iter().enumerate() { - if on && cavern.contains((ny - row) * WIDTH + x + col) { - break 'falling; - } - } - } - y = ny; + if y >= shape.len() && !collides(shape, &cavern, x, y - 1) { + y -= 1; } else { - break 'falling; + break; } }