1

私はPythonでのプログラミングに比較的慣れていません。このコードは、クラスに変換しようとするまでは完全に機能していました。数独ソルバー コードのクラスを作成して、クラスを練習し、オブジェクト指向プログラミングでつま先を試しています。

したがって、同様の問題を抱えているユーザーからの質問をたくさん読んだことがありますが、ほとんどの回答は次のとおりでした。

これが私のクラスです:

#assume sudoku is imported as a np.array, white spaces replaced by zeros


class Sudoku():

    solution_number = 1

    def __init__ (self, sud_arr):
        self.sudo = sud_arr

    #print(self.sudo)

    def possible (self, y, x, num):
        for i in range(9):
            if self.sudo[y][i] == num:
                return False
            if self.sudo[i][x] == num:
                return False
            yy = (y//3)*3
            xx = (x//3)*3
            for i in range(3):
                for j in range(3):
                    if self.sudo[yy+i][xx+j] == num:
                        return False
        return True


    def solve(self):
        for i in range(9):
            for j in range(9):
                if self.sudo[i][j] == 0:
                    for nr in range(1,10):
                         if Sudoku.possible(i,j,nr): #line 34
                            self.sudo[i][j] = nr
                            Sudoku.solve()
                            self.sudo[i][j] = 0
                    return
        if Sudoku.solution_number > 1:  #if there is more than one solution, include solution number
            print("Solution Number {}".format(Sudoku.solution_number))
        else: print("Solution Number 1")
        print(self.sudo)                                  
        Sudoku.add_sol_num()

    @classmethod
    def add_sol_num(cls):           
        cls.solution_number += 1

実行後:

s = Sudoku(su) #where su is a numpy array sudoku
s.solve() #line 52

エラーが発生します:

  File "/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py", line 52, in <module>
    s.solve()
  File "/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py", line 34, in solve
    if Sudoku.possible(i,j,nr):
TypeError: possible() missing 1 required positional argument: 'num'
[Finished in 1.9s with exit code 1]

コードが多すぎて申し訳ありません。どの部分を切り取ればよいかわかりませんでした。

4

4 に答える 4

1

メソッドを使用するself.possibleときに使用すると、Sudoku.possible は、呼び出し元のインスタンスを見つけることができないそのメソッドへの参照を取得します。

これは にも当てはまりますif Sudoku.solution_number > 1。一般に Pythonic の方法は、self変数、またはメソッドの最初の引数を使用することです (ただし、関数に渡すこともできselfます: Solution.possible(self, i, j , nr))

したがって、コードは次のようになります。

    def solve(self):
        for i in range(9):
            for j in range(9):
                if self.sudo[i][j] == 0:
                    for nr in range(1,10):
                         if self.possible(i,j,nr): #line 34
                            self.sudo[i][j] = nr
                            self.solve()
                            self.sudo[i][j] = 0
                    return
        if self.solution_number > 1:  #if there is more than one solution, include solution number
            print("Solution Number {}".format(self.solution_number))
        else: print("Solution Number 1")
        print(self.sudo)                                  
        Sudoku.add_sol_num() # add_sol_num is a @classmethod
于 2020-06-19T10:31:24.847 に答える