# ************************** Auxiliary functions ************************** # returns the binary value of a string with zeros as " " and ones as "8" def stringBinValue(strng): i = 1 value = 0 length = len(strng) while i <= length: if (strng[length - i] == "8"): value = value + pow(2,i - 1) i = i+1 return value #generalization of the slicing primary for a 'circular' string def subCircular(strng, midle, margin): if (midle - margin< 0): return strng[midle - margin:] + strng[:midle + margin+1] elif (midle + margin > len(strng) - 1): return strng[midle - margin:] + strng[:(midle+margin+1)%len(strng)] else: return strng[midle - margin:midle+margin+1] # returns input or default value def inputWithDef(defValue): try: return input() except: return defValue # ***************************** Classes ***************************** class Row: text="" width = 0 limMin = 0 limMax = 0 def initialize(self, initString, width, min, max): self.text = initString self.width = width self.limMin = min self.limMax = max def nextGeneration(self): length = len(self.text) i = 0 aux = "" while i < length: if (stringBinValue(subCircular(self.text, i, self.width)) < self.limMin or stringBinValue(subCircular(self.text, i, self.width)) > self.limMax): aux = aux + "8" else: aux = aux + " " i = i + 1 self.text = aux # *************************** Main Code Block ************************* print "\n\n\n\n\n* * * * * A Python Example For Pattern Generation * * * * *" print "\n[Enter values or accept default]\n\n" anotherRun, width, minimum, maximum, initial = "Y", 4, 130, 470, "88888 8 88 8 888888 8 88 8 888888 8 88 8 888888 8 88 8 888888 8 88 8 " while (anotherRun=="Y" or anotherRun=="y"): print "Initial pattern by default:" print initial print "Enter new initial pattern :" aux = raw_input() if (aux != ""): initial = aux print "Enter width (%(width)d):" %vars() width = inputWithDef(width) print "Enter minimum (%(minimum)d):" %vars() minimum = inputWithDef(minimum) print "Enter maximum (%(maximum)d):" %vars() maximum = inputWithDef(maximum) row = Row() row.initialize(initial, width, minimum, maximum) i=0 while i < 30: print row.text row.nextGeneration() i=i+1 print "Another run (Y/N)?" anotherRun = raw_input()