From 9e79211174d669e3e0cebf52332af0f24a513c59 Mon Sep 17 00:00:00 2001 From: Vasily Guzov Date: Wed, 27 Nov 2024 21:57:49 +0300 Subject: [PATCH] [HAI] isValidSudoku WIP --- lib/isValidSudoku/index.ts | 3 ++ lib/isValidSudoku/isValidSudoku.test.ts | 34 +++++++++++++ lib/isValidSudoku/isValidSudoku.ts | 65 +++++++++++++++++++++++++ lib/isValidSudoku/readme.md | 45 +++++++++++++++++ 4 files changed, 147 insertions(+) create mode 100644 lib/isValidSudoku/index.ts create mode 100644 lib/isValidSudoku/isValidSudoku.test.ts create mode 100644 lib/isValidSudoku/isValidSudoku.ts create mode 100644 lib/isValidSudoku/readme.md diff --git a/lib/isValidSudoku/index.ts b/lib/isValidSudoku/index.ts new file mode 100644 index 0000000..cd42629 --- /dev/null +++ b/lib/isValidSudoku/index.ts @@ -0,0 +1,3 @@ +import { isValidSudoku } from "./isValidSudoku"; + +export default isValidSudoku; diff --git a/lib/isValidSudoku/isValidSudoku.test.ts b/lib/isValidSudoku/isValidSudoku.test.ts new file mode 100644 index 0000000..d5d8e91 --- /dev/null +++ b/lib/isValidSudoku/isValidSudoku.test.ts @@ -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(); + }); +}); diff --git a/lib/isValidSudoku/isValidSudoku.ts b/lib/isValidSudoku/isValidSudoku.ts new file mode 100644 index 0000000..189dedb --- /dev/null +++ b/lib/isValidSudoku/isValidSudoku.ts @@ -0,0 +1,65 @@ +export function isValidSudoku(board: string[][]): boolean { + const rowTable: Record = {} + const colTable: Record = {} + const cellTable: Record = {} + + 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 +}; diff --git a/lib/isValidSudoku/readme.md b/lib/isValidSudoku/readme.md new file mode 100644 index 0000000..895a83d --- /dev/null +++ b/lib/isValidSudoku/readme.md @@ -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 + +```