2024 Day 15 Performance improvements

This commit is contained in:
Burnus 2024-12-16 19:32:19 +01:00
parent ad0f968b3f
commit a4460964fb
2 changed files with 14 additions and 12 deletions

View file

@ -6,7 +6,7 @@ edition = "2021"
[dependencies] [dependencies]
[dev-dependencies] [dev-dependencies]
# criterion = "0.5.1" criterion = "0.5.1"
[[bench]] [[bench]]
name = "test_benchmark" name = "test_benchmark"

View file

@ -65,7 +65,7 @@ impl TryFrom<&str> for Warehouse {
impl Warehouse { impl Warehouse {
fn perform_sequence(&mut self, sequence: &[Coordinates]) { fn perform_sequence(&mut self, sequence: &[Coordinates]) {
for &step in sequence { for &step in sequence {
let next = adjust(self.robot, step, 1); let next = (self.robot.0 + step.0, self.robot.1 + step.1);
if self.walls.contains(&next) { if self.walls.contains(&next) {
continue; continue;
} }
@ -87,7 +87,7 @@ impl Warehouse {
fn try_push(&mut self, from: &[Coordinates], direction: Coordinates) -> bool { fn try_push(&mut self, from: &[Coordinates], direction: Coordinates) -> bool {
let mut pushed = Vec::new(); let mut pushed = Vec::new();
for &start in from { for &start in from {
let next = adjust(start, direction, 1); let next = (start.0+direction.0, start.1 + direction.1);
let next_l = if self.widened { (next.0-1, next.1 ) } else { next }; let next_l = if self.widened { (next.0-1, next.1 ) } else { next };
let next_r = if self.widened { (next.0+1, next.1 ) } else { next }; let next_r = if self.widened { (next.0+1, next.1 ) } else { next };
if self.walls.contains(&next) || self.walls.contains(&next_r) { if self.walls.contains(&next) || self.walls.contains(&next_r) {
@ -101,16 +101,22 @@ impl Warehouse {
if pushed.is_empty() { if pushed.is_empty() {
from.iter().for_each(|&start| { from.iter().for_each(|&start| {
self.boxes.remove(&start); self.boxes.remove(&start);
}); self.boxes.insert((start.0 + direction.0, start.1 + direction.1));
from.iter().for_each(|&start| {
self.boxes.insert(adjust(start, direction, 1));
}); });
true true
} else { } else {
pushed.append(&mut from.to_vec()); // pushed.append(&mut from.to_vec());
pushed.sort(); pushed.sort();
pushed.dedup(); pushed.dedup();
self.try_push(&pushed, direction) if self.try_push(&pushed, direction) {
from.iter().for_each(|&start| {
self.boxes.remove(&start);
self.boxes.insert((start.0 + direction.0, start.1 + direction.1));
});
true
} else {
false
}
} }
} }
@ -128,10 +134,6 @@ impl Warehouse {
} }
} }
fn adjust(from: Coordinates, by: Coordinates, steps: isize) -> Coordinates {
(from.0 + steps * by.0, from.1 + steps * by.1)
}
fn try_sequence_from(seq: &str) -> Result<Vec<Coordinates>, ParseError> { fn try_sequence_from(seq: &str) -> Result<Vec<Coordinates>, ParseError> {
seq.lines().flat_map(|l| l.chars().map(|c| { seq.lines().flat_map(|l| l.chars().map(|c| {
match c { match c {