improve split_from

This commit is contained in:
Simon Gardling 2025-01-27 22:19:35 -05:00
parent 58b84fa3ac
commit be8f97d4f1
Signed by: titaniumtown
GPG Key ID: 9AB28AC10ECE533D
2 changed files with 8 additions and 14 deletions

View File

@ -1,16 +1,10 @@
pub fn split(min: usize, max: usize, x: usize) -> Vec<Vec<usize>> { pub fn split_from(min: usize, max: usize, x: usize) -> Vec<Vec<usize>> {
if min > x || x > max { if min > x || x > max {
return Vec::new(); return Vec::new();
} }
let index = x - min; let x_lower = x.checked_sub(1).unwrap_or(min);
let x_upper = (x + 1).min(max);
let collected = (min..=max).collect::<Vec<usize>>(); vec![(min..=x_lower).rev().collect(), (x_upper..=max).collect()]
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)] #[cfg(test)]
@ -19,6 +13,6 @@ mod test {
#[test] #[test]
fn split_test() { fn split_test() {
assert_eq!(split(0, 6, 2), vec![vec![1, 0], vec![3, 4, 5, 6]]); assert_eq!(split_from(0, 6, 2), vec![vec![1, 0], vec![3, 4, 5, 6]]);
} }
} }

View File

@ -1,6 +1,6 @@
use std::fmt; use std::fmt;
use crate::misc::split; use crate::misc::split_from;
#[derive(Copy, Clone, PartialEq, Eq, Debug)] #[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Piece { pub enum Piece {
@ -80,12 +80,12 @@ impl Board {
return; return;
}; };
let mut chains: Vec<Vec<(usize, usize)>> = split(0, BOARD_SIZE - 1, i) let mut chains: Vec<Vec<(usize, usize)>> = split_from(0, BOARD_SIZE - 1, i)
.into_iter() .into_iter()
.map(|range| range.into_iter().map(|i| (i, j)).collect()) .map(|range| range.into_iter().map(|i| (i, j)).collect())
.collect(); .collect();
chains.append( chains.append(
&mut split(0, BOARD_SIZE - 1, j) &mut split_from(0, BOARD_SIZE - 1, j)
.into_iter() .into_iter()
.map(|range| range.into_iter().map(|j| (i, j)).collect()) .map(|range| range.into_iter().map(|j| (i, j)).collect())
.collect::<Vec<Vec<(usize, usize)>>>(), .collect::<Vec<Vec<(usize, usize)>>>(),