Implement a couple straightforward heuristics
This commit is contained in:
parent
f76cc06bc9
commit
e6bf7ec12b
|
@ -0,0 +1,197 @@
|
||||||
|
use mino::matrix::{COLUMNS, EMPTY_ROW, FULL_ROW};
|
||||||
|
use mino::Mat;
|
||||||
|
|
||||||
|
pub fn max_height(matrix: &Mat) -> i32 {
|
||||||
|
matrix.rows() as i32
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn i_deps(matrix: &Mat) -> i32 {
|
||||||
|
let mut depth = [0u8; COLUMNS as usize];
|
||||||
|
let mut count = 0;
|
||||||
|
for y in 0..matrix.rows() {
|
||||||
|
// 012345689xxxx
|
||||||
|
// ↑
|
||||||
|
// _______xxx___
|
||||||
|
let mut mask = 0b111 << (COLUMNS - 2);
|
||||||
|
// _______x.x___
|
||||||
|
let mut test = 0b101 << (COLUMNS - 2);
|
||||||
|
for x in (0..COLUMNS).rev() {
|
||||||
|
if matrix.test_row(y, mask, test) {
|
||||||
|
depth[x as usize] += 1;
|
||||||
|
depth[x as usize] %= 4;
|
||||||
|
if depth[x as usize] == 3 {
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
depth[x as usize] = 0;
|
||||||
|
}
|
||||||
|
mask = mask >> 1;
|
||||||
|
test = test >> 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn row_trans(matrix: &Mat) -> i32 {
|
||||||
|
let mut prev_row = FULL_ROW;
|
||||||
|
let mut count = 0;
|
||||||
|
for &curr_row in &matrix[..] {
|
||||||
|
count += (curr_row ^ prev_row).count_ones();
|
||||||
|
prev_row = curr_row;
|
||||||
|
}
|
||||||
|
count += (prev_row ^ EMPTY_ROW).count_ones();
|
||||||
|
count as i32
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
use mino::mat;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_i_deps() {
|
||||||
|
assert_eq!(i_deps(Mat::EMPTY), 0);
|
||||||
|
assert_eq!(
|
||||||
|
i_deps(mat! {
|
||||||
|
"xxxxx...xx";
|
||||||
|
"xxxxx..xxx";
|
||||||
|
"xxxxx.xx.x";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
}),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
i_deps(mat! {
|
||||||
|
"xxx.....xx";
|
||||||
|
"xxxx..xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"x.xxx.xxxx";
|
||||||
|
}),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
i_deps(mat! {
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
}),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
i_deps(mat! {
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
}),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
i_deps(mat! {
|
||||||
|
"xxxxxxxx.x";
|
||||||
|
"xxxxxxxx.x";
|
||||||
|
"xxxxxxxx.x";
|
||||||
|
"xxxxxxxx.x";
|
||||||
|
"x.xxxxxxxx";
|
||||||
|
"x.xxxxxxxx";
|
||||||
|
"x.xxxxxxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
}),
|
||||||
|
3,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
i_deps(mat! {
|
||||||
|
// 6 rows
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
}),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
i_deps(mat! {
|
||||||
|
// 7 rows
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
}),
|
||||||
|
2
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
i_deps(mat! {
|
||||||
|
"x.x......x";
|
||||||
|
"x.xxx.xxxx";
|
||||||
|
"x.xxx.xxxx";
|
||||||
|
"x.xxx.xxxx";
|
||||||
|
}),
|
||||||
|
2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_row_trans() {
|
||||||
|
assert_eq!(row_trans(Mat::EMPTY), 10);
|
||||||
|
assert_eq!(
|
||||||
|
row_trans(mat! {
|
||||||
|
"x.........";
|
||||||
|
"xx........";
|
||||||
|
"xxx.......";
|
||||||
|
"xxxx......";
|
||||||
|
"xxxxx.....";
|
||||||
|
"xxxxxx....";
|
||||||
|
"xxxxxxx...";
|
||||||
|
"xxxxxxxx..";
|
||||||
|
"xxxxxxxxx.";
|
||||||
|
"xxxxxxxxxx";
|
||||||
|
}),
|
||||||
|
10,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
row_trans(mat! {
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
}),
|
||||||
|
9 + 1,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
row_trans(mat! {
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
}),
|
||||||
|
9 + 1,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
row_trans(mat! {
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
"xxxx.Xxxxx";
|
||||||
|
}),
|
||||||
|
9 + 2 + 1
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
row_trans(mat! {
|
||||||
|
"xxxxx.xxx.";
|
||||||
|
"xx....xxxx";
|
||||||
|
}),
|
||||||
|
8 + 4 + 4
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
row_trans(mat! {
|
||||||
|
"xxxx..xxxx";
|
||||||
|
"xxxx...xxx";
|
||||||
|
"xxxxx.xxxx";
|
||||||
|
}),
|
||||||
|
8 + 1 + 2 + 1,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
pub mod ai;
|
pub mod ai;
|
||||||
|
pub mod eval;
|
||||||
pub mod find;
|
pub mod find;
|
||||||
|
|
||||||
#[cfg(feature = "io")]
|
#[cfg(feature = "io")]
|
||||||
|
|
Loading…
Reference in New Issue