rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;
use std::collections::HashSet;

type Point = Vec<i32>;

struct Chessboard {
    directions: Vec<Point>,
    queens: HashSet<Point>,
    king: Point,
}

impl Chessboard {
    fn new(queens_vec: Vec<Point>, king: Point) -> Self {
        let directions: Vec<Point> = vec![
            vec![1, 0],
            vec![-1, 0],
            vec![0, 1],
            vec![0, -1],
            vec![1, 1],
            vec![-1, 1],
            vec![1, -1],
            vec![-1, -1],
        ];
        let mut queens: HashSet<Point> = HashSet::new();
        for queen in queens_vec {
            queens.insert(queen);
        }
        Chessboard {
            king,
            queens,
            directions,
        }
    }
    fn contains(&self, point: &[i32]) -> bool {
        point[0] >= 0 && point[1] >= 0 && point[0] < 8 && point[1] < 8
    }
    fn attack(&self, i: usize, step: i32) -> Point {
        let direction = &self.directions[i];
        let king = &self.king;
        vec![king[0] + direction[0] * step, king[1] + direction[1] * step]
    }
}

impl Solution {
    fn queens_attackthe_king(queens: Vec<Vec<i32>>, king: Vec<i32>) -> Vec<Vec<i32>> {
        let mut res = vec![];
        let cb = Chessboard::new(queens, king);
        for i in 0..8 {
            let mut step = 1;
            loop {
                let p = cb.attack(i, step);
                if cb.contains(&p) {
                    if cb.queens.contains(&p) {
                        res.push(p);
                        break;
                    } else {
                        step += 1;
                    }
                } else {
                    break;
                }
            }
        }
        res
    }
}

#[test]
fn test() {
    let queens = vec_vec_i32![[0, 1], [1, 0], [4, 0], [0, 4], [3, 3], [2, 4]];
    let king = vec![0, 0];
    let mut res = vec_vec_i32![[0, 1], [1, 0], [3, 3]];
    let mut ans = Solution::queens_attackthe_king(queens, king);
    res.sort();
    ans.sort();
    assert_eq!(ans, res);
    let queens = vec_vec_i32![[0, 0], [1, 1], [2, 2], [3, 4], [3, 5], [4, 4], [4, 5]];
    let king = vec![3, 3];
    let mut res = vec_vec_i32![[2, 2], [3, 4], [4, 4]];
    let mut ans = Solution::queens_attackthe_king(queens, king);
    res.sort();
    ans.sort();
    assert_eq!(ans, res);
    let queens = vec_vec_i32![
        [5, 6],
        [7, 7],
        [2, 1],
        [0, 7],
        [1, 6],
        [5, 1],
        [3, 7],
        [0, 3],
        [4, 0],
        [1, 2],
        [6, 3],
        [5, 0],
        [0, 4],
        [2, 2],
        [1, 1],
        [6, 4],
        [5, 4],
        [0, 0],
        [2, 6],
        [4, 5],
        [5, 2],
        [1, 4],
        [7, 5],
        [2, 3],
        [0, 5],
        [4, 2],
        [1, 0],
        [2, 7],
        [0, 1],
        [4, 6],
        [6, 1],
        [0, 6],
        [4, 3],
        [1, 7]
    ];
    let king = vec![3, 4];
    let mut res = vec_vec_i32![[2, 3], [1, 4], [1, 6], [3, 7], [4, 3], [5, 4], [4, 5]];
    let mut ans = Solution::queens_attackthe_king(queens, king);
    res.sort();
    ans.sort();
    assert_eq!(ans, res);
}