improve prop range splitting
This commit is contained in:
parent
6dde0ff29f
commit
a1373ec338
@ -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
24
src/misc.rs
Normal 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]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
29
src/repr.rs
29
src/repr.rs
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user