Sudoku generator: Allgemeine Frage zu Sudoku-Zusammenhängen.
Was natürlich die schlechtere der beiden Lösungsmöglichkeiten ist. Dispersio's Vorschlag ist sauberer.
Wenn ich jeder Funktion das Sudoku übergebe, verbraucht das nicht mehr Speicher, statt wie mit einer identischen Instanz?BlackJack hat geschrieben:Was natürlich die schlechtere der beiden Lösungsmöglichkeiten ist. Dispersio's Vorschlag ist sauberer.
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Du uebergibst ja nur eine Referenz auf das Objekt, keine Kopie des Objektes. Schau dir mal die Konzepte call by value/call by reference und mutable/immutable an.akis.kapo hat geschrieben:Wenn ich jeder Funktion das Sudoku übergebe, verbraucht das nicht mehr Speicher, statt wie mit einer identischen Instanz?
So wahrscheinlich...
Code: Alles auswählen
#!/usr/bin/python
import random
def newline():
line = range(1,10)
random.shuffle(line)
return line
def valid(s):
return rowscols_check(s) and squares_check(s)
def rowscols_check(s):
sudoku = s
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(s):
sudoku = s
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
def new():
sudoku = [newline()]
while len(sudoku) < 9:
sudoku.append(newline())
if not valid(sudoku):
sudoku.remove(sudoku[-1])
return sudoku
Zuletzt geändert von akis.kapo am Mittwoch 6. Dezember 2006, 18:55, insgesamt 1-mal geändert.
Probier Deinen Code doch einfach mal vorher aus.
Bei ``s = sudoku`` wird Python jeweils meckern das `sudoku` nicht bekannt ist. Nenn doch einfach den Parameter `sudoku` anstatt `s`.
Bei ``s = sudoku`` wird Python jeweils meckern das `sudoku` nicht bekannt ist. Nenn doch einfach den Parameter `sudoku` anstatt `s`.
Habs korrigiert. (Ohne zu testen. )
EDIT:
und noch ein ungetestetes Update:
EDIT:
und noch ein ungetestetes Update:
Code: Alles auswählen
#!/usr/bin/python
import random
def newline():
line = range(1,10)
random.shuffle(line)
return line
def valid(s):
return rowscols_check(s) and squares_check(s)
def rowscols_check(sudoku):
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(sudoku):
sets = [set(), set(), set()]
for i in xrange(3):
for row in sudoku[i*3:i*3+3]:
for j in xrange(3):
for elem in row[j*3:j*3+3]:
sets[j].add(elem)
cursize = len(sudoku[i*3:i*3+3])
for s in sets:
if len(s) < 3 * cursize:
return False
s.clear()
return True
def new():
sudoku = [newline()]
while len(sudoku) < 9:
sudoku.append(newline())
if not valid(sudoku):
sudoku.remove(sudoku[-1])
return sudoku