[python-users] Pydoku

Benjamin Wolters benjaminwolters at benwol.de
Mi Okt 17 13:51:04 CEST 2007


hätte ich auch selber drauf kommen können, hab schließlich sein Buch
gelesen :~) Vielen Dank

allerdings benötigte ich als Ausgabe Prolog kompatible listen [X,X,X,X]
und hätte sein Prog umschreiben müssen. Naja, immerhin mein hab ich mein
erstes Python Programm selber geschrieben :)

Interessant ist allerdings das er zur Lösung eine Tiefensuche in Form
des Backtracking(Prolog impliziert auch über backtracking) benutzt und
kein algorithmisches Ausschlussverfahren?!?! Ich schaus mir am we mal
genauer an.





On Wed, 2007-10-17 at 13:24 +0200, Muharem Hrnjadovic wrote:
> Hier ist die Peter Norvig (Director of Research at Google) Variante:
> http://norvig.com/sudoku.html
> 
> Mit freundlichen Grüßen
> 
> 
> --
> Muharem Hrnjadovic
> mailto:muharem at hrnjad.net
> 
> 
> 
> 
> 
> On Oct 17, 2007, at 1:08 PM, Benjamin Wolters wrote:
> 
> > 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
> > <pydoku.py>
> > ________________________________________
> > Diese Mail erhalten Sie ueber die Mailingliste Python-users der
> > Universitaet zu Koeln
> > Python-users at uni-koeln.de
> > https://lists.uni-koeln.de/mailman/listinfo/python-users
> 
> 
> ________________________________________
> Diese Mail erhalten Sie ueber die Mailingliste Python-users der Universitaet zu Koeln
> Python-users at uni-koeln.de
> https://lists.uni-koeln.de/mailman/listinfo/python-users



Mehr Informationen über die Mailingliste python-users