Da hat sich wohl irgendein böser character eingeschlichen. Wenn ich das Copy & Paste vom Notepad aus mache, statt vom gvim, klappt es ohne den Fehler.
Wenn ich dann richtig richtig geduldig bin bekomme ich sogar ein korrektes Ergebnis, zum Beispiel:
[3, 7, 1, 8, 4, 2, 6, 9, 5]
[8, 4, 9, 5, 6, 1, 3, 7, 2]
[6, 2, 5, 3, 9, 7, 4, 8, 1]
[9, 8, 3, 7, 5, 6, 2, 1, 4]
[5, 6, 4, 1, 2, 8, 9, 3, 7]
[2, 1, 7, 4, 3, 9, 5, 6, 8]
[1, 9, 6, 2, 8, 4, 7, 5, 3]
[7, 3, 2, 6, 1, 5, 8, 4, 9]
[4, 5, 8, 9, 7, 3, 1, 2, 6]
Oder seht ihr da ein Fehler? (Ich hab aber echt ewig gewartet!)
@Blackjack
jetzt versteht ich welches return du meinst... sorry. klar, da muss ich um die while noch ne funktion bauen...
EDIT:
Code: Alles auswählen
#!/usr/bin/python
import random
def newline():
line = range(1,10)
random.shuffle(line)
return line
def rowscols_check():
aset = set()
for col in xrange(9):
for row in xrange(len(sudoku)):
aset.add(sudoku[row][col])
if len(aset) < len(sudoku):
return False
aset.clear()
return True
def squares_check():
aset, bset, cset = set(), set(), set()
for i in xrange(3):
for row in sudoku[i*3:i*3+3]:
for elem in row[0:3]:
aset.add(elem)
for elem in row[3:6]:
bset.add(elem)
for elem in row[6:9]:
cset.add(elem)
cursize = len(sudoku[i*3:i*3+3])
for s in [aset,bset,cset]:
if len(s) < 3 * cursize:
return False
s.clear()
return True
sudoku = [newline()]
def new():
while len(sudoku) < 9:
sudoku.append(newline())
if not (rowscols_check() and squares_check()):
sudoku.remove(sudoku[-1])
return sudoku
Jetzt zufrieden?