[python-users] Pydoku

Benjamin Wolters benjaminwolters at benwol.de
Mi Okt 17 13:08:09 CEST 2007


Hallo zusammen,

Anfang des Jahres benötigte ich einen Sudoku erzeugendes Programm.
Damals habe ich mich das erste Mal mit Python auseinander gesetzt und
somit auch Pydoku geschrieben. Jetzt möchte ich ihm mal gegen lesen
lassen, ob dieser auch Python konform ist oder ob ihr ihn anders
geschrieben hättet. Wahrscheinlich bekomme ich es demnächst öfters mit
Python zu tun, deshalb die späte Mail.

Hier mein Pydoku (auch im Anhang als py):
_____________________
import random
import operator

##########################################
#Basic Pydoku Class
class Pydoku(object):
    pydoku = [[ 0,0,0,0,0,0,0,0,0 ],
              [ 0,0,0,0,0,0,0,0,0 ],
              [ 0,0,0,0,0,0,0,0,0 ],
              [ 0,0,0,0,0,0,0,0,0 ],
              [ 0,0,0,0,0,0,0,0,0 ],
              [ 0,0,0,0,0,0,0,0,0 ],
              [ 0,0,0,0,0,0,0,0,0 ],
              [ 0,0,0,0,0,0,0,0,0 ],
              [ 0,0,0,0,0,0,0,0,0 ]]

    def checkPydokuRules(self, r, c, val):
        rb = abs(r / 3) * 3
        cb = abs(c / 3) * 3
        for row in range(rb, rb+3):
            for col in range(cb, cb+3):
                if self.pydoku[row][col] == val:
                    return False
        return self.checkRow(r, val) & self.checkLine(c, val)
        
    def checkRow(self,rowNumber,checkNumber):
        for cell in self.pydoku[rowNumber]:
            if cell == checkNumber:
                return False
        return True
        
    
    def checkLine(self,lineNumber,checkNumber):
        for row in self.pydoku:
            if row[lineNumber] == checkNumber:
                return False
        return True

    def printPydoku(self):
        i = 0
        print 'Pydoku:'
        for row in self.pydoku:
            print  row
            
    def getPydoku(self):
        return self.pydoku

##########################################
# PydokuCreator Class
class PydokuCreator(Pydoku):
    
    def createPydoku(self):
        for row in range(9):
            while operator.contains(self.pydoku[row],0):
                self.pydoku[row] = [ 0,0,0,0,0,0,0,0,0 ]
                for val in range(1,10):
                    self.addNumber(row,range(9),val)        
        
    def addNumber(self,row,cols,val):
        ok = True
        col = random.choice( cols )
        if self.pydoku[row][col] == 0 and
self.checkPydokuRules(row,col,val):
                self.pydoku[row][col] = val
        else:
            cols.remove(col)
            if len(cols) == 0:
                return
            self.addNumber(row,cols,val)
            
    def getPydoku(self,grade):
        tmpPydoku = self.pydoku
        removed = False
        for i in range(81-grade):
            removed = False
            while not removed:
                row = random.randint(0,8)
                col = random.randint(0,8)
                if tmpPydoku[row][col] != 0:
                    tmpPydoku[row][col] = 0
                    removed = True
        return tmpPydoku
        
##########################################
# PydokuSolver
#class PydokuSolver(Pydoku):
#   
#    def solvePydoku(self):
#        self

p = PydokuCreator()
p.createPydoku()
p.printPydoku()

tmp = p.getPydoku(22)
print 'Pydoku of grade:', grade
for row in tmp:
    print row

______________________


Die 22 steht für den Schwierigkeitsgrad und der Solver ist in Prolog
geschrieben, deshalb auch nicht implementiert.

Viele Grüße
Ben
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : pydoku.py
Dateityp    : text/x-python
Dateigröße  : 2877 bytes
Beschreibung: nicht verfügbar
URL         : <http://lists.uni-koeln.de/pipermail/python-users/attachments/20071017/c6dc0fb9/attachment.py>


Mehr Informationen über die Mailingliste python-users