What is the mistake in this Sudoku checker code?

Click For Summary

Discussion Overview

The discussion revolves around identifying mistakes in a Python implementation of a Sudoku checker function. Participants analyze the code's logic and behavior, focusing on the validation of Sudoku rules for both rows and columns.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant expresses confusion about the output of their code, which returns False for all test cases, and seeks help in identifying the mistake.
  • Another participant suggests adding a print statement to debug the nested loop, indicating that the current logic may not be functioning as intended.
  • A participant acknowledges a misunderstanding regarding the distinction between rows and columns in their code, noting that the first part of the code works correctly but suspects an issue in the second part.
  • A later post introduces an alternative implementation of a Sudoku checker, which includes checks for integer types and duplicates in rows and columns.

Areas of Agreement / Disagreement

Participants do not reach a consensus on the specific mistake in the original code, but there is agreement that the second part of the code likely contains the error. Multiple perspectives on debugging and alternative implementations are presented.

Contextual Notes

Participants discuss the logic of checking rows and columns, but the exact nature of the mistakes in the original code remains unresolved. The discussion includes potential misunderstandings about the structure of the input data.

doktorwho
Messages
181
Reaction score
6

Homework Statement


Python:
# Sudoku [[PLAIN]http://en.wikipedia.org/wiki/Sudoku][/PLAIN] 
# is a logic puzzle where a game
# is defined by a partially filled
# 9 x 9 square of digits where each square
# contains one of the digits 1,2,3,4,5,6,7,8,9.
# For this question we will generalize
# and simplify the game.

# Define a procedure, check_sudoku,
# that takes as input a square list
# of lists representing an n x n
# sudoku puzzle solution and returns the boolean
# True if the input is a valid
# sudoku square and returns the boolean False
# otherwise.

# A valid sudoku square satisfies these
# two properties:

#   1. Each column of the square contains
#       each of the whole numbers from 1 to n exactly once.

#   2. Each row of the square contains each
#       of the whole numbers from 1 to n exactly once.

# You may assume the the input is square and contains at
# least one row and column.

correct = [[1,2,3],
           [2,3,1],
           [3,1,2]]

incorrect = [[1,2,3,4],
             [2,3,1,3],
             [3,1,2,3],
             [4,4,4,4]]

incorrect2 = [[1,2,3,4],
             [2,3,1,4],
             [4,1,2,3],
             [3,4,1,2]]

incorrect3 = [[1,2,3,4,5],
              [2,3,1,5,6],
              [4,5,2,1,3],
              [3,4,5,2,1],
              [5,6,4,3,2]]

incorrect4 = [['a','b','c'],
              ['b','c','a'],
              ['c','a','b']]

incorrect5 = [ [1, 1.5],
               [1.5, 1]]
             
def check_sudoku(p):
    rows=[]
    coloums=[]
    t=0
    for i in p:
        for e in i:
            if e not in rows:
                rows.append(e)
            else:
                return False
        rows=[]
    while t<=len(p):
        for i in p:
            if i.pop() not in coloums:
                coloums.append(i.pop())
            else:
                return False
        coloums=[]
        t += 1
    return True
 
print check_sudoku(incorrect)
#>>> False

print check_sudoku(correct)
#>>> True

print check_sudoku(incorrect2)
#>>> False

print check_sudoku(incorrect3)
#>>> False

print check_sudoku(incorrect4)
#>>> False

print check_sudoku(incorrect5)
#>>> False

Homework Equations


3. The Attempt at a Solution [/B]
I don't actually want you to correct me, i just want for you to point out where i made the mistake as my code output gives all as False. I was sure it correctly checked everything, i have no idea why its behaving this way. The first part must be correct but the second might be the problem. Do you see the mistake?
 
Last edited by a moderator:
  • Like
Likes   Reactions: berkeman
Technology news on Phys.org
I don't think your nested loop is doing what you think. Try putting a print statement after the "for e in i:" line that prints out e and rows. I think you will quickly see the problem.
 
phyzguy said:
I don't think your nested loop is doing what you think. Try putting a print statement after the "for e in i:" line that prints out e and rows. I think you will quickly see the problem.
I exchanged what should be rows and what coloums, for me the rows are the elements in a sublists and the coloums are respective elements in each list. When i delete the second part of the code and check just the rows everything is ok. I even messed up something to know ots false and it gives it as false. The problem is in the second part. After the while statement. I can't see what it is.
 
Got it :D
 
What about this one? (since you found your answer)
Python:
def checker( board ):
    for row in board:
        memory_list=[]
        for entry in row:
            if not isinstance(entry, int) or (entry>len(board)) : return False # make sure that all sudoku inputs are integers, else break out with False
            if (entry in memory_list) and (len(memory_list)!=0): return False #repeated integer in row
            memory_list.append(entry)
    for iCol in range(len(board)):
        memory_list=[]
        Column= [row[iCol] for row in board]
        for entry in Column:
            if (entry in memory_list) and (len(memory_list)!=0): return False
            memory_list.append(entry)
    return True
 

Similar threads

  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 28 ·
Replies
28
Views
5K
  • · Replies 18 ·
Replies
18
Views
2K
  • · Replies 10 ·
Replies
10
Views
1K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 6 ·
Replies
6
Views
3K
  • · Replies 13 ·
Replies
13
Views
4K
  • · Replies 11 ·
Replies
11
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K