momo 18 Posté(e) le 26 juillet 2006 Partager Posté(e) le 26 juillet 2006 def bfinterpreter(source, dataset): MaxInstructions=100000 compt=IP=POS=datp=0 loop=[] # pile pour les IP des [ loope=0 # repere pour [ : sert a detecter le ] correspondant afin de reprendre l'execution sortie=[] # contrairement a ce qu'il suggère, il s'agit de la memoire de travail shel=[] # sortie "shell" du programme (valeurs numeriques des codes ASCII) sortsize=30000 for a in range(sortsize+1): sortie.append(0) while comptsortsize: POS=0 IP=IP+1 # pointeur -- elif inst=="<": if loope==0: POS=POS-1 if POS<0>255: sortie[POS]=0 IP=IP+1 # dec elif inst=="-": if loope==0: sortie[POS]=sortie[POS]-1 if sortie[POS]<0: sortie[POS]=255 IP=IP+1 # loop start elif inst=="[": loop.append(IP) IP=IP+1 if sortie[POS]==0: loope=loope+1 # loop end avec detection d'orphelin pour permettre une selection genetique elif inst=="]": if len(loop)>0: if loope>0: loop.pop() loope=loope-1 IP=IP+1 elif loope==0: IP=loop.pop() else: compt=2*MaxInstructions # input elif inst==",": IP=IP+1 if loope==0: sortie[POS]=dataset[datp] datp=datp+1 if datp>len(dataset): count=MaxInstructions print "error data" # output elif inst==".": if loope==0: shel.append(sortie[POS]) #print chr(sortie[POS]), #sortie ASCII IP=IP+1 # gestion des erreurs et fin de programme elif inst=="end": compt=MaxInstructions print "end of program" else: IP=IP+1 # print "n",IP,len(source),POS,loope,inst,"n" return [(compt+IP),shel] # test de l'interpréteur : 1/ boubles imbriquées # 2/ fibbionacie simple # 3/ fibionnaci complexe (sort des codes ASCII corrects) #prog="+++++[->++++++++++[-.]<]" #prog="+.>+.>>>++++++++++++[<<<[->>+<<]>>[-<+<+>>]<<<[->+<]>>[-<<+>>]<.>>>-][[+.>+.>>>++++++++++++[<<<[->>+<<]>>[-<+<+>>]<<<[->+<]>>[-<<+>>]<.>>>-]]]" prog=">++++++++++>+>+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[[-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>]<<<]" print bfinterpreter(prog,[2]) un petit projet à la con pour jouer avec une pseudo alife : le but à terme est donc de creer des organismes en brainfuck avec un objectif à la con du genre calculer pi ou bien e ou autre connerie du genre. Bon pour le moment j'ai un espece d'interpreteur, et sur le papier j'ai un système de notation, je dois encore mettre au point la partie selection/mutation. bon ce ne sera pas très rapide puisque je ne vais pas me faire chier à tester plus d'un organisme à la fois, avec un maximum de quatres (c'est lent quand même) et une absence total de reproduction sexuée. sinon, ouais, j'ai trop joué avec avida (et je cherchais une mauvaise excuse pour me relancer en python) Lien à poster
TeKa 8 Posté(e) le 26 juillet 2006 Partager Posté(e) le 26 juillet 2006 Euh, j'ai rien compris! :lol Mais je testerai ton code pour essayer de comprendre! Lien à poster
momo 18 Posté(e) le 26 juillet 2006 Auteur Partager Posté(e) le 26 juillet 2006 j'essaie juste d'appliquer les théories darwiniennes à la résolution d'un problème mathématique ... et pour le moment, tout ce que j'ai c'est la "VM" de base pour de vrais trucs interessants : http://www.greythumb.org/twiki/bin/view/GreyThumb/Elemental http://www.greythumb.org/twiki/bin/view/GreyThumb/Ouroboros http://www.greythumb.org/blog/ edit: marrant le bug qui fait de mes "<" des "<;" ... Lien à poster
TeKa 8 Posté(e) le 26 juillet 2006 Partager Posté(e) le 26 juillet 2006 Je viens de comprendre que le Brainfuck est un langage! :oups http://fr.wikipedia.org/wiki/Brainfuck Lien à poster
momo 18 Posté(e) le 29 juillet 2006 Auteur Partager Posté(e) le 29 juillet 2006 from random import * MaxInstructions=100000 def bfinterpreter(source, dataset): # interpreteur brainfuck compt=IP=POS=datp=0 loop=[] # pile pour les IP des [ loope=0 # repere pour [ : sert a detecter le ] correspondant afin de reprendre l'execution sortie=[] # contrairement a ce qu'il suggère, il s'agit de la memoire de travail shel=[] # sortie "shell" du programme (valeurs numeriques des codes ASCII) sortsize=30000 for a in range(sortsize+1): sortie.append(0) while comptsortsize: POS=0 IP=IP+1 # pointeur -- elif inst=="<": if loope==0: POS=POS-1 if POS<0>255: sortie[POS]=0 IP=IP+1 # dec elif inst=="-": if loope==0: sortie[POS]=sortie[POS]-1 if sortie[POS]<0: sortie[POS]=255 IP=IP+1 # loop start elif inst=="[": loop.append(IP) IP=IP+1 if sortie[POS]==0: loope=loope+1 # loop end avec detection d'orphelin pour permettre une selection genetique elif inst=="]": if len(loop)>0: if loope>0: loop.pop() loope=loope-1 IP=IP+1 elif loope==0: IP=loop.pop() else: compt=2*MaxInstructions # input elif inst==",": IP=IP+1 if loope==0: sortie[POS]=dataset[datp] datp=datp+1 if datp>len(dataset): count=MaxInstructions print "error data" # output elif inst==".": if loope==0: shel.append(sortie[POS]) #print chr(sortie[POS]), #sortie ASCII IP=IP+1 # gestion des erreurs et fin de programme elif inst=="end": compt=MaxInstructions print "end of program" else: IP=IP+1 # print "n",IP,len(source),POS,loope,inst,"n" return [(compt+IP),shel] def evaluateprogram(errorcode,shel,plength,expected): # systeme de notation errorcode=errorcode-MaxInstructions score=100-((errorcode*50)/MaxInstructions) # % d'execution if len(expected)<=len(shel): compteur=0 for index in range(len(expected)): if shel[index]==expected[index]: compteur=compteur+1 success=compteur*100/len(expected) # % de sortie correcte scoref=(score+success)/2 # % final return scoref def mutation(): # mutation, fin et insertion dans le programme insts=["+","-",">","<",".",",","[","]","end","ins","ins"] output=insts[randrange(0,10)] return output def reproduceprogram(source,nbchild): # reproduction childs=[] seed() for index in range(nbchild): child="" pointer=0 for pointer in range(len(source)): if randrange(0,100)<=7: mut=mutation() print mut if mut=="end": pointer=len(source) elif mut=="ins": mut1="x" while mut1=="x" or mut1=="end" or mut1=="ins": mut1=mutation() child=child+mut1+source[pointer] else: child=child+mut else: child=child+source[pointer] childs.append(child) return childs ça avance doucement ... mais bon, je crois que mon evalation de l'organime laisse franchement à désirer. Lien à poster
momo 18 Posté(e) le 29 juillet 2006 Auteur Partager Posté(e) le 29 juillet 2006 from random import * MaxInstructions=1000000 def bfinterpreter(source, dataset): # interpreteur brainfuck compt=IP=POS=datp=0 loop=[] # pile pour les IP des [ loope=0 # repere pour [ : sert a detecter le ] correspondant afin de reprendre l'execution sortie=[] # contrairement a ce qu'il suggère, il s'agit de la memoire de travail shel=[] # sortie "shell" du programme (valeurs numeriques des codes ASCII) sortsize=30000 ab=0 for a in range(sortsize+1): sortie.append(0) while comptsortsize: POS=0 IP=IP+1 # pointeur -- elif inst=="<": if loope==0: POS=POS-1 if POS<0>255: sortie[POS]=0 IP=IP+1 # dec elif inst=="-": if loope==0: sortie[POS]=sortie[POS]-1 if sortie[POS]<0>=len(shel): for index in range(len(shel)): if shel[index]==expected[index]: compteur=compteur+1 else: compteur=0 break success=compteur #*100/len(expected) # % de sortie correcte scoref=success+score# % final return scoref def mutation(): # mutation, fin et insertion dans le programme insts=["+","-",">","++++.") oscores.append(0) while 1: for index in range(number): #execution ocode=bfinterpreter(osources[index],[0]) # notation oscores[index]=evaluateprogram(ocode[0],ocode[1],prevu) if oscores[index]>tempscore: tempscore=oscores[index] indexscore=index # reproduction du meilleur parent=osources[indexscore] print parent,tempscore osources=reproduceprogram(parent,number-1) osources.append(parent) tempscore=indexscore=0 il était temps que je finisses : je commence déjà à ne plus comprendre mon programme ... bon, sinon, quelques bricolages pour eviter les boucles non fermées et favoriser les insertions .... Lien à poster
thev 0 Posté(e) le 29 juillet 2006 Partager Posté(e) le 29 juillet 2006 Le forum, pas aussi pratique qu'un CVS quand même... et pour la disponibilité... à voir Sinon excellent le Brainfuck. @+ Lien à poster
momo 18 Posté(e) le 29 juillet 2006 Auteur Partager Posté(e) le 29 juillet 2006 pas aussi pratiques, certes, mais ça m'évites de sortir un marteau pilon pour enfoncer une punaise mais bon, au moins j'ai découvert un bug dans le forum Lien à poster
christophe 0 Posté(e) le 31 juillet 2006 Partager Posté(e) le 31 juillet 2006 thev > Le Goto++ est intéressant dans le genre aussi http://gpp.niacland.net/ Lien à poster
Messages recommandés