2

私は Python で 4x4 数独ソルバーを作成しようとしています (私は初心者です!)。関数を定義してコードをクリーンアップしようとしているときに、よくわからない奇妙な動作に出くわしました。どうやら、これには違いがあります:

sudoku = "0200140000230040"

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku))
for i in range(16):
    for j in range(4):
        if sudoku[i] == str(j+1):
            for k in range(4):
                if len(sudoku[i/4*4+k]) > 1:
                    sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1))
            for k in range(4):
                if len(sudoku[4*k+i%4]) > 1:
                    sudoku[4*k+i%4] = sudoku[4*k+i%4].translate(None, str(j+1))

そしてこれ:

sudoku = "0200140000230040"

def sd(l):
    for k in range(4):
        if len(sudoku[l]) > 1:
            sudoku[l] = sudoku[l].translate(None, str(j+1))

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku))
for i in range(16):
    for j in range(4):
        if sudoku[i] == str(j+1):
            sd(i/4*4+k)
            sd(4*k+i%4)

奇妙な式は、行と列をチェックするためのものです (ボックスはまだ完成していません)。この種の質問が既にある場合は、時間を無駄にして申し訳ありませんが、両方のコード スニペットを実行して、得られるさまざまな結果を観察してみてください。前もって感謝します。

(怒られそうな変な予感がするな。はぁ)

4

1 に答える 1

2

違いがあります... 2 つの異なるエラーで失敗します!

最初は私にこのエラーを与えます:

  File "test.py", line 9, in <module>
    sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1))
TypeError: expected a character buffer object

2番目は私にこのエラーを与えます:

  File "test.py", line 12, in <module>
    sd(i/4*4+k)
NameError: name 'k' is not defined

主な問題は、「i/4*4+k」の式ツリーがパラメーターとして関数に渡されると想定していることだと思いますが、実際には関数呼び出しが行われる前に評価され、k ではないため失敗します。定義されています。代わりにこれを使用できます:

    sd(lambda k: i/4*4+k)

関数内では、sdl を l(k) の呼び出しに置き換えることができます。これで、両方のプログラムで同じエラーが発生します。

于 2010-01-23T14:18:48.177 に答える