Así que estoy haciendo un solucionador básico de sudoku de fuerza bruta. Creé una clase que toma una cadena de tablero y uso un constructor para configurar this.board = parámetro de tablero pasado
export default class SudokuSolver { constructor(board){ this.board = board }el primer método que se ejecuta es validBoardFormat
validBoardFormat(){ /* possible input formats: CSV of 81 integers or string of 81 integers 0's replace unknown numbers*/ let cleanedBoard=[]; let uncleanedBoard = this.board.split('') //split by character for (let i = 0; i<uncleanedBoard.length; i++){ if (this.validNum(uncleanedBoard[i])){ //validate with validNum function cleanedBoard.push(parseInt(uncleanedBoard[i])) } } if (cleanedBoard.length === 81){ this.board = cleanedBoard //make sure board matches correct sudoku board length return true } return false }Digamos, por ejemplo, pasar:
let boardString = "1024091501202523235" //imagine this is a valid board string const board = new SudokuSolver(boardString) console.log(board.validBoardFormat()) console: trueEsto funciona perfectamente bien por sí solo.
más adelante en la clase defino un método de resolución
solve(){ if (this.validBoardFormat()){ this.validBoardFormat() this.configureBoardArray() this.solveBoard() } else { console.log('Board error') } }El problema es cuando paso esto:
let boardString = "1024091501202523235" //imagine this is a valid board string const board = new SudokuSolver(board) console.log(board.solve())y lo ejecuto en liveserver, recibo este error:
Uncaught TypeError: this.board.split is not a function en la función validBoardFormat
He estado tratando de solucionar este problema por un tiempo ahora cualquier ayuda sería apreciada
No puede hacer const board = new SudokuSolver(board) porque la variable del tablero aún no está definida. Debe hacer const board = new SudokuSolver(boardString) .
Está configurando this.board en una matriz:
if (cleanedBoard.length === 81){ this.board = cleanedBoard // <= this.board is now an array return true } Entonces, la próxima vez que llame a validBoardFormat() , terminará intentando invocar la split en la matriz, no en la cadena:
let uncleanedBoard = this.board.split('') // this.board is now an array, not a stringAhora me doy cuenta de que en mi método de resolución, estaba haciendo validBoardFormat dentro de la declaración if en sí, lo que altera el valor de this.board de una cadena (entrada original) a una matriz. Después de pasar la instrucción if, ejecuta this.validBoardFormat nuevamente, pero ahora this.board es una matriz, por lo que ya no puede hacer .split().
para solucionar esto, he almacenado el retorno de this.validBoardFormat en una variable y luego uso ese valor para continuar
solve(){ let validation = this.validBoardFormat() if (validation){ this.configureBoardArray() this.solveBoard() return this.board } else { console.log('Board error') } }Es extraño lo rápido que puedes encontrar tus propios errores cuando finalmente pides ayuda después de mirarlo durante mucho tiempo de antemano, lmao