What is the mistake in this Sudoku checker code?

Click For Summary
The discussion focuses on identifying mistakes in a Sudoku checker code. The original code fails to correctly validate columns, leading to all outputs being False. The user realizes that they mixed up the logic for checking rows and columns, as the second part of the code is problematic. Suggestions include adding print statements for debugging and a revised function that checks both rows and columns effectively. The revised function ensures that all entries are integers and checks for duplicates in both rows and columns.
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 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
 
Learn If you want to write code for Python Machine learning, AI Statistics/data analysis Scientific research Web application servers Some microcontrollers JavaScript/Node JS/TypeScript Web sites Web application servers C# Games (Unity) Consumer applications (Windows) Business applications C++ Games (Unreal Engine) Operating systems, device drivers Microcontrollers/embedded systems Consumer applications (Linux) Some more tips: Do not learn C++ (or any other dialect of C) as a...

Similar threads

  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 28 ·
Replies
28
Views
4K
  • · 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 4 ·
Replies
4
Views
2K
  • · Replies 0 ·
Replies
0
Views
1K