aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/sudoku/validation.ts
blob: 4403a20e0f1b63d21ab605da2eb2429499706fe4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import type { Coord, Grid } from "../Sudoku";

export function validate(board: Grid) {
  const bads = [] as Coord[];
  for (let i = 0; i < 9; i++) {
    for (let j = 0; j < 9; j++) {
      const value = board[i][j];
      if (value !== '.') {
        if (!validateRow(board, i, j, value) || !validateColumn(board, i, j, value) || !validateBox(board, i, j, value)) {
          bads.push({ x: i, y: j })
        }
      }
    }
  }
  return bads;
};

function validateRow(board: Grid, row: number, col: number, value: string) {
  for (let j = 0; j < 9; j++) {
    if (j !== col) {
      if (board[row][j] === value) {
        return false;
      }
    }
  }

  return true;
}

function validateColumn(board: Grid, row: number, col: number, value: string) {
  for (let i = 0; i < 9; i++) {
    if (i !== row) {
      if (board[i][col] === value) {
        return false;
      }
    }
  }

  return true;
}

function validateBox(board: Grid, row: number, col: number, value: string) {
  const startRow = row - (row % 3), startCol = col - (col % 3);

  for (let i = startRow; i < startRow + 3; i++) {
    for (let j = startCol; j < startCol + 3; j++) {
      if (i !== row && j !== col) {
        if (board[i][j] === value) {
          return false;
        }
      }
    }
  }

  return true;
}