Sudoku Algorithm Problem

Ive been pieceing this together for a while and i am solving my puzzle but i cant get the loop to break out after it is solved. i have a ‘return true’ statement where i think i need it but it kicks it out way too early. When i comment it out i can get it solved about halfway through the code but it keeps running. Not sure how i can get it to stop.

First function is a function to transform string to a 2d array.

2nd function is a validation function.

3rd is the solve.

const boardstring = '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..'


function transform(puzzleString){
  const N = 9
  let row = -1
  let col = 0
  const grid = [ [], [] , [] , [], [] ,[] ,[] ,[] ,[]  ];
  let mystring = puzzleString
   for(let i = 0; i < mystring.length; i++){
     if(i % 9 == 0){
       row++
     }
     grid[row][col] = mystring[i];
     col++
     if(col % 9 == 0){
       col = 0;
     }
   }
   return grid
  }


  function isValid (row, col, board, val){   
        let rowDiff = Math.floor(row / 3) * 3;
        let colDiff = Math.floor(col / 3) * 3;
        
        for(let i = 0; i < board.length; i++) {          
            if(board[row][i] === val) return false;          
            if(board[i][col] === val) return false;         
            if(board[rowDiff + Math.floor(i / 3)][colDiff + i % 3] === val) {       
                return false;
            }         
        }  
  return true; 
    }

  
function solve(board){ 
  console.log(board) 
  // start row at 0 
        for(let row = 0; row < board.length; row++){
          
  //   console.log('stage 1')            
  //   start col at 0   
          
              for(let col = 0; col < board[row].length; col++){  
                
  //   if a character is 0 move to next loop
                
                   if(board[row][col] == '.') {
                     
   //  console.log('stage 2')                
  //   change '.' to loop through 1-9 
                     
                        for(let i = 1; i <= 9; i++) {
                          
   //   console.log('stage 3')
   //   console.log(i + ' '+ row + ' ' + col)                     
  //    check if new character is valid
                          
                             if(isValid(row, col, board, String(i))) {              
                                  board[row][col] = String(i);
                               
  //     console.log('stage 4')                             
  //     if new character is valid, start new solve loop
                               
                             if(solve(board)) {
                               
         console.log('stage 5')
         
   //                       return true;
         
                                }
                               
  //  console.log('stage 6')
  // if solve fails, change character back to '.'
                               
                               board[row][col] = '.';
                          }
                          
   //  console.log('not valid')
                          
                    }
                     
 //   console.log('stage 7')
                     
                 return true;
                }
                
//    console.log('stage 8')
                
            } 
          
//    console.log('stage 9')
          
        }
  
// console.log('stage 10')
  
  return board.flat(1).join(); 
            }



console.log(solve(transform(boardstring)))

i switched to a different approach to back tracking. I am using an idea i found online and i got it to work on JS Bin while testing it. I can get it to transform a string to an array and then take that array and solve it.

The problem is that it wont solve it in my web app. I added logging call outs at different stages and it seems as soon as it passes my validation method it wont recall the solve method on itself. I just dont understand what is different in the web app vs all the IDEs i have tried it in and have it working.



  transform(puzzleString){
    const N = 9
    let row = -1
    let col = 0
    const grid = [ [], [] , [] , [], [] ,[] ,[] ,[] ,[]  ];
    let mystring = puzzleString
  
     for(let i = 0; i < mystring.length; i++){
       if(i % 9 == 0){
         row++
       }
         grid[row][col] = mystring[i];
         col++
         if(col % 9 == 0){
           col = 0;
         }
     }
   return  grid
  }



  solve(data) {
    console.log('start solving')
    function isValid(board, row, col, k) {
      for (let i = 0; i < 9; i++) {
        const m = 3 * Math.floor(row / 3) + Math.floor(i / 3);
        const n = 3 * Math.floor(col / 3) + i % 3;
        if (board[row][i] == k || board[i][col] == k || board[m][n] == k) {
          console.log('failed valid')
          return false;
        }
    }
      console.log('sucess valid')
    return true;
}

  for (let i = 0; i < 9; i++) {
    console.log(i)
    for (let j = 0; j < 9; j++) {
      console.log(j)
      if (data[i][j] == '.') {
        for (let k = 1; k <= 9; k++) {
          console.log(k)
          if (isValid(data, i, j, k)) {
            console.log('success 4')
            data[i][j] = `${k}`;
          if (solve(data)) {
            console.log('success 1')
           return data;
          } else {
            console.log('failed 3')
           data[i][j] = '.';
          }
         }
       }
        console.log('failed 2')
       return false;
     }
   }
 }
    console.log('success 2')
 return data;
}

my route

 app.route('/api/solve')
    .post((req, res) => {
    const puzzlestring = req.body.puzzle;
      console.log(puzzlestring)
      const retarray = solver.transform(puzzlestring)
      console.log(retarray);
      const solution = solver.solve(retarray)
      console.log(solution)
      res,json({solutiion: solution})
      
    });

i havent added a filter to test if the string has valid characters or not yet but that shouldnt matter until i start testing other strings. i am just using a test string that should work

looks like i need to burhs up on my javascript class syntax. In order for me to recall the solve method. I needed to make sure it was calling an instance of the class by using this.solve

I believe i am hitting all of the storys. I printed all of the inputs on the api/check routes, but i am still failing.

I dont know if i am printing the json wrong?

Can someone run this through the test to see if it passes for them?

sudoku replit

free code camp test site