Sudoku generator: Allgemeine Frage zu Sudoku-Zusammenhängen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

akis.kapo hat geschrieben:Hmmm... wie lange musstest du auf diese 9 Zeilen warten?

Ich bin nie über 7 Zeilen hinausgegangen. Auf 7 erfolgreich erzeugte Zeilen folgten immer abermillionen Fehlversuche, bis ich abgebrochen habe.
Merkwuerdig. Hier ein paar Durchlaeufe von mir: http://paste.pocoo.org/show/285/
(Ich habe das return in Zeile 52 durch die Sudoku-Ausgabe ersetzt.)
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

lol, du musst ein Glückspilz sein.

Hast du denn eine Idee wieso ich squares_check() is not defined bekomme, bei meinem letzten Code beispiel?
BlackJack

Die Meldung bekomme ich nicht!?

Auch von mir nochmal die Frage: Was soll das ``return`` am Ende?
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

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? :D
Dispersio
User
Beiträge: 11
Registriert: Freitag 24. November 2006, 14:24

auf die gefahr hin das ich geköpft werde :shock:

muss man nicht den anderen funktionen sudoku von new übergeben???
Is ja kein suduku in den anderen funktionen definiert
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

Du warst zu schnell, minuten später hab ich das sudoku aus der funktion raus genommen eine ebene höher, so dass es jetzt passt.
BlackJack

Was natürlich die schlechtere der beiden Lösungsmöglichkeiten ist. Dispersio's Vorschlag ist sauberer.
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

BlackJack hat geschrieben: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?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

akis.kapo hat geschrieben:Wenn ich jeder Funktion das Sudoku übergebe, verbraucht das nicht mehr Speicher, statt wie mit einer identischen Instanz?
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. :)
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

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.
BlackJack

Probier Deinen Code doch einfach mal vorher aus. :roll:

Bei ``s = sudoku`` wird Python jeweils meckern das `sudoku` nicht bekannt ist. Nenn doch einfach den Parameter `sudoku` anstatt `s`.
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

Habs korrigiert. (Ohne zu testen. :oops: )

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

Antworten