[HAI] isValidSudoku WIP
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
import { isValidSudoku } from "./isValidSudoku";
|
||||
|
||||
export default isValidSudoku;
|
||||
@@ -0,0 +1,34 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { isValidSudoku } from "./isValidSudoku.ts";
|
||||
|
||||
describe("isValidSudoku", () => {
|
||||
|
||||
it("true case", () => {
|
||||
const board =
|
||||
[["5", "3", ".", ".", "7", ".", ".", ".", "."]
|
||||
, ["6", ".", ".", "1", "9", "5", ".", ".", "."]
|
||||
, [".", "9", "8", ".", ".", ".", ".", "6", "."]
|
||||
, ["8", ".", ".", ".", "6", ".", ".", ".", "3"]
|
||||
, ["4", ".", ".", "8", ".", "3", ".", ".", "1"]
|
||||
, ["7", ".", ".", ".", "2", ".", ".", ".", "6"]
|
||||
, [".", "6", ".", ".", ".", ".", "2", "8", "."]
|
||||
, [".", ".", ".", "4", "1", "9", ".", ".", "5"]
|
||||
, [".", ".", ".", ".", "8", ".", ".", "7", "9"]];
|
||||
|
||||
expect(isValidSudoku(board)).toBeTruthy();
|
||||
});
|
||||
|
||||
it("false case", () => {
|
||||
const board =
|
||||
[["8", "3", ".", ".", "7", ".", ".", ".", "."]
|
||||
, ["6", ".", ".", "1", "9", "5", ".", ".", "."]
|
||||
, [".", "9", "8", ".", ".", ".", ".", "6", "."]
|
||||
, ["8", ".", ".", ".", "6", ".", ".", ".", "3"]
|
||||
, ["4", ".", ".", "8", ".", "3", ".", ".", "1"]
|
||||
, ["7", ".", ".", ".", "2", ".", ".", ".", "6"]
|
||||
, [".", "6", ".", ".", ".", ".", "2", "8", "."]
|
||||
, [".", ".", ".", "4", "1", "9", ".", ".", "5"]
|
||||
, [".", ".", ".", ".", "8", ".", ".", "7", "9"]]
|
||||
expect(isValidSudoku(board)).toBeFalsy();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,65 @@
|
||||
export function isValidSudoku(board: string[][]): boolean {
|
||||
const rowTable: Record<string, string[]> = {}
|
||||
const colTable: Record<string, string[]> = {}
|
||||
const cellTable: Record<string, string[]> = {}
|
||||
|
||||
let cellNum = 0;
|
||||
|
||||
for (let i = 0; i < board.length; i++) {
|
||||
if (i + 1 % 3 === 0) cellNum = i;
|
||||
|
||||
for (let j = 0; j < board[i].length; j++) {
|
||||
// check repeat in rows
|
||||
const rowValue = board[i][j];
|
||||
const rowKey = i + "_" + cellNum;
|
||||
if (rowValue === ".") continue;
|
||||
|
||||
if (
|
||||
!rowTable[rowKey]
|
||||
) {
|
||||
rowTable[rowKey] = [rowValue];
|
||||
} else {
|
||||
if (rowTable[rowKey].includes(rowValue)) return false;
|
||||
rowTable[i + "_" + cellNum].push(rowValue);
|
||||
}
|
||||
}
|
||||
|
||||
// check repeat in collumns
|
||||
const collValue = board[i][i];
|
||||
const collKey = i + "_" + cellNum;
|
||||
|
||||
if (collValue === ".") continue;
|
||||
|
||||
if (!colTable[collKey]) {
|
||||
colTable[collKey] = [collValue];
|
||||
} else {
|
||||
if (colTable[collKey] && colTable[collKey].includes(collValue)) return false;
|
||||
colTable[collKey].push(collValue)
|
||||
}
|
||||
}
|
||||
|
||||
// create cellTable
|
||||
for (let cellKey = 0; cellKey < board.length; cellKey++) {
|
||||
if (cellKey + 1 % 3 === 0) cellNum = (cellKey + 1) / 3;
|
||||
let rowKey = cellKey + "_" + cellNum;
|
||||
let rowValues = rowTable[rowKey];
|
||||
|
||||
if (!cellTable[cellKey]) {
|
||||
cellTable[cellKey] = rowValues;
|
||||
} else {
|
||||
rowValues.forEach(value => {
|
||||
if (
|
||||
cellTable[cellKey].includes(value)
|
||||
) {
|
||||
return false
|
||||
}
|
||||
})
|
||||
cellTable[cellKey].concat(rowValues);
|
||||
}
|
||||
}
|
||||
|
||||
console.log({ cellTable, rowTable, colTable })
|
||||
|
||||
|
||||
return true
|
||||
};
|
||||
@@ -0,0 +1,45 @@
|
||||
# isValidSudoku
|
||||
|
||||
## описание задачи
|
||||
|
||||
## тест кейсы
|
||||
|
||||
## текстовое описание решения
|
||||
|
||||
- создаем 3 хэштаблиц для накопления результатов строк, колонок и ячеек
|
||||
- ключ составляется из номерка колонки и номера ячейки, из номера ряда и номера ячейки
|
||||
- значение массив чисел встретившихся в колонке
|
||||
- наполняем в циклах строки и колонки постепенно проверяя есть ли повторы
|
||||
- если повтор есть возвращаем false
|
||||
- в третьем цикле наполняем постепенно хэш таблицу для ячеек проверяя есть ли повторы
|
||||
- ключ номер ячейки от 0 - 8
|
||||
- значение массив чисел из ячейки получаемый только по рядам или колонкам из ранее созданх хэш таблиц
|
||||
- в процессе наполнения проверяем есть ли повторы, если повторы есть возвращем false
|
||||
- если нет true
|
||||
|
||||
## ассимптотическая оценка
|
||||
|
||||
| Description | Estimation |
|
||||
| ----------- | ---------- |
|
||||
| time: | O(n) |
|
||||
| mem: | O(n) |
|
||||
|
||||
## time
|
||||
|
||||
| Description | Time |
|
||||
| ------------------------------------------- | ----- |
|
||||
| анализ и сбор информации | 06:45 |
|
||||
| обдумываение решения и формулировка решения | 01:11:22 |
|
||||
| имплементация | 01:22:02 |
|
||||
| исправление ошибок | 00:00 |
|
||||
| полное время затраченое на решение | 00:00 |
|
||||
|
||||
## журнал ошибок
|
||||
|
||||
## code
|
||||
|
||||
### typescript
|
||||
|
||||
```ts
|
||||
|
||||
```
|
||||
Reference in New Issue
Block a user