improve prop range splitting

This commit is contained in:
Simon Gardling 2025-01-27 14:30:41 -05:00
parent 6dde0ff29f
commit a1373ec338
Signed by: titaniumtown
GPG Key ID: 9AB28AC10ECE533D
3 changed files with 38 additions and 16 deletions

View File

@ -2,6 +2,7 @@ use repr::{Board, Piece};
mod agent; mod agent;
mod game; mod game;
mod misc;
mod repr; mod repr;
fn main() { fn main() {

24
src/misc.rs Normal file
View File

@ -0,0 +1,24 @@
pub fn split(min: usize, max: usize, x: usize) -> Vec<Vec<usize>> {
if min > x || x > max {
return Vec::new();
}
let index = x - min;
let collected = (min..=max).collect::<Vec<usize>>();
let split = collected.split_at(index);
let mut one = split.0.to_vec();
one.reverse();
let mut two = split.1.to_vec();
two.remove(0);
vec![one, two]
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn split_test() {
assert_eq!(split(0, 6, 2), vec![vec![1, 0], vec![3, 4, 5, 6]]);
}
}

View File

@ -1,5 +1,7 @@
use std::fmt; use std::fmt;
use crate::misc::split;
#[derive(Copy, Clone, PartialEq, Eq, Debug)] #[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Piece { pub enum Piece {
Black, Black,
@ -76,55 +78,50 @@ impl Board {
return; return;
}; };
// both ranges expand __from__ the piece for range in split(0, BOARD_SIZE - 1, i) {
let i_ranges: Vec<Vec<usize>> =
vec![(0..i).rev().collect(), ((i + 1)..BOARD_SIZE).collect()];
let j_ranges: Vec<Vec<usize>> =
vec![(0..j).rev().collect(), ((j + 1)..BOARD_SIZE).collect()];
for i_range in i_ranges {
let mut chain_length: usize = 0; let mut chain_length: usize = 0;
for &new_i in &i_range { for &new_i in &range {
let Some(piece) = self.get(new_i, j) else { let Some(piece) = self.get(new_i, j) else {
break; break;
}; };
if piece == &starting_color { if piece == &starting_color {
if chain_length > 0 { if chain_length > 0 {
// fill all opposite colors with this color // fill all opposite colors with this color
let Some(i_o_s) = i_range.get(..chain_length) else { let Some(i_o_s) = range.get(..chain_length) else {
break; break;
}; };
// fill all opposite colors with this color
for i_o in i_o_s { for i_o in i_o_s {
self.place_and_prop_unchecked(*i_o, j, starting_color); self.place_and_prop_unchecked(*i_o, j, starting_color);
} }
} }
break; break;
} else {
chain_length += 1;
} }
chain_length += 1;
} }
} }
for j_range in j_ranges { for range in split(0, BOARD_SIZE - 1, j) {
let mut chain_length: usize = 0; let mut chain_length: usize = 0;
for &new_j in &j_range { for &new_j in &range {
let Some(piece) = self.get(i, new_j) else { let Some(piece) = self.get(i, new_j) else {
break; break;
}; };
if piece == &starting_color { if piece == &starting_color {
if chain_length > 0 { if chain_length > 0 {
let Some(j_o_s) = j_range.get(..chain_length) else { let Some(j_o_s) = range.get(..chain_length) else {
break; break;
}; };
// fill all opposite colors with this color // fill all opposite colors with this color
for j_o in j_o_s { for j_o in j_o_s {
self.place_and_prop_unchecked(i, *j_o, starting_color); self.place_and_prop_unchecked(i, *j_o, starting_color);
} }
} }
break; break;
} else {
chain_length += 1;
} }
chain_length += 1;
} }
} }
} }