# Erstellung der Grafiken zu Karl Kröber: "Ein Esel lese nie" # Buchgrafiken Auflösung etwa 640x380 from Tkinter import * # some examples # number: [base, start, rule, steps] examples = { 1: [2,"10110100","a","4M"], 2: [10,"1089","asssasssa"+"aaasss"*6,"2M"], 4: [5,"1034","assaassasassaassaassss","2M"], 5: [3,"1012","assassasasa","M"], 6: [8,"1067","a"*11+"saasasas","M"], 7: [7,"1056","a"*6+"sssaasssaa"+"s"*6+"aa","M"], 8: [10,"1089","aasaassss"+"as"*8+"a"*11,"M"], 9: [10,"1089","aasaasaas"+"as"*40+"ss","M"], 10: [10,"1089","s"*7+"aaaaass"+"a"*12,"M"] } digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # max Basis 36 palette1 = {"Back":"Grey60", "0":"Black","1":"Red1","2":"Green1","3":"Blue1", "4":"White","5":"Cyan1","6":"Magenta1","7":"Yellow1", "8":"Red3","9":"Green3","a":"Blue3","b":"Yellow3", "c":"Cyan3","d":"Magenta3","e":"Yellow3","f":"Pink1"} class MyCanvas: def __init__(self,width=400,height=300): self.root = Tk() self.root.title("The Palindromizer") self.height = height self.width = width self.raster = PhotoImage(width=self.width,height=self.height) self.label = Label(self.root,image=self.raster,background=palette1["Back"]) self.label.pack() self.root.update() self.line = 0 def display(self,n): l = len(n) start = 0 if l<=self.width: start = (self.width-l)/2 pixels = self.convert(n) else: start = 0 pixels = self.convert(n[(l-self.width)/2:(l+self.width)/2]) self.raster.put((tuple(pixels),),(start,self.line)) self.line = (self.line+1)%self.height self.root.update() def convert(self,n): p = [0]*len(n) for i in range(len(n)): p[i] = palette1[n[i]] return p def wait(self): while 1: self.root.after(250) self.root.update() ################################################################ def getdata(n): if not examples.has_key(n): ExampleError = "Beispiel "+str(n)+" ist nicht definiert" raise ExampleError e = examples[n] basis,zahl,rule = e[0],e[1],e[2] c = e[3].upper() if "M" in c: c = c[:-1] if c=="": c="1" steps = len(rule)*int(c) else: steps = int(c) return zahl,basis,rule,steps ################################################################ # Zahl n in Basis wandeln, Rueckgabe ist String def numstr(n,base): if n==0: return "0" s = "" while n>0: n,d = divmod(n,base) s = digits[d]+s return s ################################################################# # apply rulestring[index..] to zahl, repeat steps times # return result and index ################################################################ def calc(zahl,basis,rulestring,index,steps): l = len(rulestring) n = zahl for i in range(steps): n1 = list(n) n1.reverse() nrev = "".join(n1) numdigits = len(n) if rulestring[index]=="a": n = numstr(long(n,basis)+long(nrev,basis),basis) else: n = numstr(abs(long(n,basis)-long(nrev,basis)),basis) while len(n)