Seite 2 von 2

Verfasst: Mittwoch 6. Dezember 2006, 15:29
von akis.kapo
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.

Verfasst: Mittwoch 6. Dezember 2006, 16:28
von BlackJack
Was natürlich die schlechtere der beiden Lösungsmöglichkeiten ist. Dispersio's Vorschlag ist sauberer.

Verfasst: Mittwoch 6. Dezember 2006, 17:08
von akis.kapo
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?

Verfasst: Mittwoch 6. Dezember 2006, 17:24
von Rebecca
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. :)

Verfasst: Mittwoch 6. Dezember 2006, 17:29
von akis.kapo
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

Verfasst: Mittwoch 6. Dezember 2006, 18:46
von 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`.

Verfasst: Mittwoch 6. Dezember 2006, 18:56
von akis.kapo
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