Tiny performance improvement by NOT borrowing coordinates when indexing the grid(?)
This commit is contained in:
12
src/day4.rs
12
src/day4.rs
@@ -13,11 +13,11 @@ impl Day4 {
|
|||||||
Day4 { puzzle: Grid::parse(input, '.')}
|
Day4 { puzzle: Grid::parse(input, '.')}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_with_step(&self, word: &str, i: usize, j: usize, step_x: isize, step_y: isize) -> bool {
|
fn check_with_step(&self, word: &str, start_x: usize, start_y: usize, step_x: isize, step_y: isize) -> bool {
|
||||||
let mut x = i;
|
let mut x = start_x;
|
||||||
let mut y = j;
|
let mut y = start_y;
|
||||||
for c in word.chars() {
|
for c in word.chars() {
|
||||||
if self.puzzle.get(&x, &y) == &c {
|
if self.puzzle.get(x, y) == &c {
|
||||||
x = x.wrapping_add_signed(step_x);
|
x = x.wrapping_add_signed(step_x);
|
||||||
y = y.wrapping_add_signed(step_y);
|
y = y.wrapping_add_signed(step_y);
|
||||||
} else {
|
} else {
|
||||||
@@ -35,7 +35,7 @@ impl DaySolver for Day4 {
|
|||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
for i in 0..self.puzzle.width {
|
for i in 0..self.puzzle.width {
|
||||||
for j in 0..self.puzzle.height() {
|
for j in 0..self.puzzle.height() {
|
||||||
if self.puzzle.get(&i, &j) == &'X' {
|
if self.puzzle.get(i, j) == &'X' {
|
||||||
// Horizontal & Vertical
|
// Horizontal & Vertical
|
||||||
if self.check_with_step("XMAS", i, j, 1, 0) { count += 1; }
|
if self.check_with_step("XMAS", i, j, 1, 0) { count += 1; }
|
||||||
if self.check_with_step("XMAS", i, j, 0, 1) { count += 1; }
|
if self.check_with_step("XMAS", i, j, 0, 1) { count += 1; }
|
||||||
@@ -56,7 +56,7 @@ impl DaySolver for Day4 {
|
|||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
for i in 1..self.puzzle.width {
|
for i in 1..self.puzzle.width {
|
||||||
for j in 1..self.puzzle.height() {
|
for j in 1..self.puzzle.height() {
|
||||||
if self.puzzle.get(&i, &j) == &'A' {
|
if self.puzzle.get(i, j) == &'A' {
|
||||||
// We search from the center, so:
|
// We search from the center, so:
|
||||||
if (self.check_with_step("MAS", i-1, j-1, 1, 1) ||
|
if (self.check_with_step("MAS", i-1, j-1, 1, 1) ||
|
||||||
self.check_with_step("SAM", i-1, j-1, 1, 1)) &&
|
self.check_with_step("SAM", i-1, j-1, 1, 1)) &&
|
||||||
|
|||||||
14
src/util.rs
14
src/util.rs
@@ -36,12 +36,12 @@ impl<T: Clone + Sized> Grid<T> {
|
|||||||
|
|
||||||
pub fn set_col(&mut self, x: usize, v: T) {
|
pub fn set_col(&mut self, x: usize, v: T) {
|
||||||
for y in 0..self.height() {
|
for y in 0..self.height() {
|
||||||
let idx = self.idx(&x, &y);
|
let idx = self.idx(x, y);
|
||||||
self.data[idx] = v.to_owned();
|
self.data[idx] = v.to_owned();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn idx(&self, x: &usize, y: &usize) -> usize {
|
pub(crate) fn idx(&self, x: usize, y: usize) -> usize {
|
||||||
y * self.width + x
|
y * self.width + x
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ impl<T: Clone + Sized> Grid<T> {
|
|||||||
self.data.len() / self.width
|
self.data.len() / self.width
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn get(&self, x: &usize, y: &usize) -> &T {
|
pub(crate) fn get(&self, x: usize, y: usize) -> &T {
|
||||||
if self.in_bounds(x, y) {
|
if self.in_bounds(x, y) {
|
||||||
let idx = self.idx(x, y);
|
let idx = self.idx(x, y);
|
||||||
&self.data[idx]
|
&self.data[idx]
|
||||||
@@ -64,13 +64,13 @@ impl<T: Clone + Sized> Grid<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set(&mut self, x: &usize, y: &usize, v: T) {
|
pub fn set(&mut self, x: usize, y: usize, v: T) {
|
||||||
let idx = self.idx(x, y);
|
let idx = self.idx(x, y);
|
||||||
self.data[idx] = v;
|
self.data[idx] = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn in_bounds(&self, x: &usize, y: &usize) -> bool {
|
pub fn in_bounds(&self, x: usize, y: usize) -> bool {
|
||||||
x < &self.width && y < &self.height()
|
x < self.width && y < self.height()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn find_positions<'a, P>(&'a self, predicate: &'a P) -> impl Iterator<Item = Coord<usize>> + 'a
|
pub fn find_positions<'a, P>(&'a self, predicate: &'a P) -> impl Iterator<Item = Coord<usize>> + 'a
|
||||||
@@ -99,7 +99,7 @@ impl <T: Display + Clone + Sized> Grid<T> {
|
|||||||
|
|
||||||
for y in from_y.max(0)..to_y.min(self.height()) {
|
for y in from_y.max(0)..to_y.min(self.height()) {
|
||||||
for x in from_x.max(0)..to_x.min(self.width) {
|
for x in from_x.max(0)..to_x.min(self.width) {
|
||||||
print!("{}", self.get(&x, &y))
|
print!("{}", self.get(x, y))
|
||||||
}
|
}
|
||||||
println!();
|
println!();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user