arc-agi 0.1.6

ARC-AGI submission
Documentation
use pathfinding::prelude::Matrix;
use crate::cats::Colour;
use crate::cell::Cell;

// Expensive when applied to every cell
pub fn surround_cnt(m: &Matrix<Cell>, r: usize, c: usize, colour: Colour) -> (usize, bool) {
    let mut cnt = 0;
    let rows = m.rows - 1;
    let cols = m.columns - 1;
    let mut edge = true;

    if r > 0 && r < rows && c > 0 && c < cols {
        if m[(r-1,c)].colour == colour { cnt += 1 };
        if m[(r,c-1)].colour == colour { cnt += 1 };
        if m[(r-1,c-1)].colour == colour { cnt += 1 };
        if m[(r+1,c)].colour == colour { cnt += 1 };
        if m[(r,c+1)].colour == colour { cnt += 1 };
        if m[(r+1,c+1)].colour == colour { cnt += 1 };
        if m[(r+1,c-1)].colour == colour { cnt += 1 };
        if m[(r-1,c+1)].colour == colour { cnt += 1 };
        edge = false;
    } else if r == 0 && c == 0 {
        cnt += 5;
        if r == rows || m[(r+1,c)].colour == colour { cnt += 1 };
        if c == cols || m[(r,c+1)].colour == colour { cnt += 1 };
        if r == rows || c == cols || m[(r+1,c+1)].colour == colour { cnt += 1 };
    } else if r == 0 {
        cnt += 3;
        if m[(r,c-1)].colour == colour { cnt += 1 };
        if r == rows || m[(r+1,c)].colour == colour { cnt += 1 };
        if c == cols || m[(r,c+1)].colour == colour { cnt += 1 };
        if r == rows || c == cols || m[(r+1,c+1)].colour == colour { cnt += 1 };
        if r == rows || m[(r+1,c-1)].colour == colour { cnt += 1 };
    } else if c == 0 {
        cnt += 3;
        if m[(r-1,c)].colour == colour { cnt += 1 };
        if r == rows || m[(r+1,c)].colour == colour { cnt += 1 };
        if c == cols || m[(r,c+1)].colour == colour { cnt += 1 };
        if r == rows || c == cols || m[(r+1,c+1)].colour == colour { cnt += 1 };
        if c == cols || m[(r-1,c+1)].colour == colour { cnt += 1 };
    } else if r == rows && c == cols {
        cnt += 5;
        if m[(r-1,c)].colour == colour { cnt += 1 };
        if m[(r,c-1)].colour == colour { cnt += 1 };
        if m[(r-1,c-1)].colour == colour { cnt += 1 };
    } else if r == rows {
        cnt += 3;
        if m[(r-1,c)].colour == colour { cnt += 1 };
        if m[(r,c-1)].colour == colour { cnt += 1 };
        if m[(r-1,c-1)].colour == colour { cnt += 1 };
        if m[(r,c+1)].colour == colour { cnt += 1 };
        if m[(r-1,c+1)].colour == colour { cnt += 1 };
    } else if c == cols {
        cnt += 3;
        if m[(r-1,c)].colour == colour { cnt += 1 };
        if m[(r,c-1)].colour == colour { cnt += 1 };
        if m[(r-1,c-1)].colour == colour { cnt += 1 };
        if m[(r+1,c)].colour == colour { cnt += 1 };
        if m[(r+1,c-1)].colour == colour { cnt += 1 };
    }

    (cnt, edge)
}