[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