1

I have a stupid bug in my code and I could not figure out for hours. My brain is about to stop.

I am solving sudoku solver. solved in javascript but I have a bug in python for loop. simple for loop producing different result. i need help please.

in javascript

const getBoxId = function (row, col) {
  const rowVal = Math.floor(row / 3) * 3;
  const colVal = Math.floor(col / 3);
  return rowVal + colVal;
};

var solveSudoku = function (board) {
  const n = board.length;
  const boxes = new Array(n),
    rows = new Array(n),
    cols = new Array(n);
  for (let i = 0; i < n; i++) {
    boxes[i] = {};
    rows[i] = {};
    cols[i] = {};
    console.log(boxes);
  }
  for (let r = 0; r < n; r++) {
    for (let c = 0; c < n; c++) {
      // if a cell does not equal to "."
      if (board[r][c] !== ".") {
        const boxId = getBoxId(r, c);
        const val = board[r][c];
        boxes[boxId][val] = true;
        rows[r][val] = true;
        cols[c][val] = true;
        console.log(rows);
      }
    }
  }
};

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"],
];

console.log(solveSudoku(board));

this is the "rows" in javascript

[
  { '3': true, '5': true, '7': true },
  { '1': true, '5': true, '6': true, '9': true },
  { '6': true, '8': true, '9': true },
  { '3': true, '6': true, '8': true },
  { '1': true, '3': true, '4': true, '8': true },
  { '2': true, '6': true, '7': true },
  { '2': true, '6': true, '8': true },
  { '1': true, '4': true, '5': true, '9': true },
  { '7': true, '8': true, '9': true }
]

Here is the headache part. Implementing same code in python;

import math
def get_box_id(r,c):
    row=int(math.floor(r/3)*3)
    col=int(math.floor(c/3))
    return row+col
def solve_sudoku(board):
    n=len(board)
    rows=[{}]*n
    cols=[{}]*n
    boxes=[{}]*n
    for r in range(n):
        for c in range(n):  
            if board[r][c]!='.':
                box_id=get_box_id(r,c)     
                val=board[r][c]
                boxes[box_id][val]=True
                rows[r][val]=True
                cols[c][val]=True
                print(rows)
solve_sudoku(board) # same board as above

after 81 iteration, I am getting this:

    [{'5': True, '3': True, '7': True, '6': True, '1': True, '9': True, '8': True, '4': True, '2': True}, 
{'5': True, '3': True, '7': True, '6': True, '1': True, '9': True, '8': True, '4': True, '2': True}, {'5': True, '3': True, '7': True, '6': True, '1': True, '9': True, '8': True, '4': True, '2': True}, 
{'5': True, '3': True, '7': True, '6': True, '1': True, '9': True, '8': True, '4': True, '2': True}, 
{'5': True, '3': True, '7': True, '6': True, '1': True, '9': True, '8': True, '4': True, '2': True}, 
{'5': True, '3': True, '7': True, '6': True, '1': True, '9': True, '8': True, '4': True, '2': True}, 
{'5': True, '3': True, '7': True, '6': True, '1': True, '9': True, '8': True, '4': True, '2': True}, 
{'5': True, '3': True, '7': True, '6': True, '1': True, '9': True, '8': True, '4': True, '2': True}, 
{'5': True, '3': True, '7': True, '6': True, '1': True, '9': True, '8': True, '4': True, '2': True}]

2 Answers 2

1

Please try the following code and check if it helps.

import math
def get_box_id(r,c):
    row=int(math.floor(r/3)*3)
    col=int(math.floor(c/3))
    return row+col
def solve_sudoku(board):
    n=len(board)
    rows=[{} for i in range (n)]
    cols=[{} for i in range (n)]
    boxes=[{} for i in range (n)]
    for r in range(n):
        for c in range(n):  
            if board[r][c]!='.':
                box_id=get_box_id(r,c)
                val=board[r][c]
                boxes[box_id][val]=True
                rows[r][val]=True
                cols[c][val]=True
    
    print(rows)
    
solve_sudoku(board) # same board as above

Update:

More info on the changes.

Change #1

changed [{}] * n to [{} for i in range (n)] because [{}] * n makes a list with n references to the same {} source.

Change #2

printing the rows when all the processing completed (this is only done to see all the rows after processing).

Sign up to request clarification or add additional context in comments.

4 Comments

What did you change and why?
Change #1 [{}] * n to [{} for i in range (n)] because [{}] * n makes a list with n references to the same {} source. Change #2 printing the rows when all the processing completed (this is only done to see all the rows after processing).
So update your answer instead of posting that in a comment. It is useful for other people to read what the problem was and what you did to solve it
sure, I've updated the answer.
0

You just need to replace [{}]*n with [{} for i in range(n)]

Because both of them work differently:

list_a = [{}] * 9  # creating copy with reference to the same object {}

print(list_a)  # [{}, {}, {}, {}, {}, {}, {}, {}, {}]

#changing first object in the list
list_a[0]['hello'] = 'bye'

print(list_a) 

# output of above print statement
# [{'hello': 'bye'}, {'hello': 'bye'}, {'hello': 'bye'}, {'hello': 'bye'}, {'hello': 'bye'}, {'hello': 'bye'}, {'hello': 'bye'}, {'hello': 'bye'}, {'hello': 'bye'}]




# now try this

list_b = [{} for i in range(9)]

print(list_b) # [{}, {}, {}, {}, {}, {}, {}, {}, {}] 

list_b[0]['hello'] = 'bye'

print(list_b)

# output of above print statement 
# [{'hello': 'bye'}, {}, {}, {}, {}, {}, {}, {}, {}]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.