Aller au contenu

je n'ai pas de serveur svn ou cvs mais j'ai un forum donc ..


momo

Messages recommandés

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 :D

(et je cherchais une mauvaise excuse pour me relancer en python)

Lien à poster

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 "<;" ... :D

Lien à poster

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

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
×
×
  • Créer...