rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;

struct Chess {
    r: usize,
    c: usize,
}

enum Direction {
    Right,
    Down,
    Left,
    Up,
}

impl Solution {
    fn search_rook(board: &[Vec<char>]) -> Chess {
        for r in 0..8 {
            for c in 0..8 {
                if board[r][c] == 'R' {
                    return Chess { r, c };
                }
            }
        }
        unreachable!()
    }
    fn search_pawn(board: &[Vec<char>], rook: &Chess, direction: Direction) -> bool {
        let mut r = rook.r;
        let mut c = rook.c;

        match direction {
            Direction::Right => {
                while c + 1 < 8 && board[r][c + 1] != 'B' {
                    c += 1;
                    if board[r][c] == 'p' {
                        return true;
                    }
                }
            }
            Direction::Down => {
                while r + 1 < 8 && board[r + 1][c] != 'B' {
                    r += 1;
                    if board[r][c] == 'p' {
                        return true;
                    }
                }
            }
            Direction::Left => {
                while c > 0 && board[r][c - 1] != 'B' {
                    c -= 1;
                    if board[r][c] == 'p' {
                        return true;
                    }
                }
            }
            Direction::Up => {
                while r > 0 && board[r - 1][c] != 'B' {
                    r -= 1;
                    if board[r][c] == 'p' {
                        return true;
                    }
                }
            }
        }
        false
    }
    fn num_rook_captures(board: Vec<Vec<char>>) -> i32 {
        let mut sum = 0;
        let rook: Chess = Self::search_rook(&board);
        for direction in vec![
            Direction::Right,
            Direction::Down,
            Direction::Left,
            Direction::Up,
        ] {
            if Self::search_pawn(&board, &rook, direction) {
                sum += 1;
            }
        }
        sum
    }
}

#[test]
fn test() {
    let board = vec_vec_char![
        ['.', '.', '.', '.', '.', '.', '.', '.'],
        ['.', '.', '.', 'p', '.', '.', '.', '.'],
        ['.', '.', '.', 'R', '.', '.', '.', 'p'],
        ['.', '.', '.', '.', '.', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.', '.', '.'],
        ['.', '.', '.', 'p', '.', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.', '.', '.']
    ];
    let res = 3;
    assert_eq!(Solution::num_rook_captures(board), res);
    let board = vec_vec_char![
        ['.', '.', '.', '.', '.', '.', '.', '.'],
        ['.', 'p', 'p', 'p', 'p', 'p', '.', '.'],
        ['.', 'p', 'p', 'B', 'p', 'p', '.', '.'],
        ['.', 'p', 'B', 'R', 'B', 'p', '.', '.'],
        ['.', 'p', 'p', 'B', 'p', 'p', '.', '.'],
        ['.', 'p', 'p', 'p', 'p', 'p', '.', '.'],
        ['.', '.', '.', '.', '.', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.', '.', '.']
    ];
    let res = 0;
    assert_eq!(Solution::num_rook_captures(board), res);
    let board = vec_vec_char![
        ['.', '.', '.', '.', '.', '.', '.', '.'],
        ['.', '.', '.', 'p', '.', '.', '.', '.'],
        ['.', '.', '.', 'p', '.', '.', '.', '.'],
        ['p', 'p', '.', 'R', '.', 'p', 'B', '.'],
        ['.', '.', '.', '.', '.', '.', '.', '.'],
        ['.', '.', '.', 'B', '.', '.', '.', '.'],
        ['.', '.', '.', 'p', '.', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.', '.', '.']
    ];
    let res = 3;
    assert_eq!(Solution::num_rook_captures(board), res);
}