#!/usr/bin/python

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
#                                                                         #
# ipridi (Iterated Prisoner's Dilemma) v0.1, by Little Neo, June 2005     #
#                                                                         #
# the goal of this game is to program players to win tournaments          #
# in an environnement of cooperation and defects                          #
#                                                                         #
# A player is programmed like that :                                      #
#                                                      |||||              #
# def player_name(turn,me):                             o -    don't      #
#      (do some stuff)                                   |    be shy !    #
#      (return 1 to cooperate or 0 to defect)           \_/ __/           #
#                                                                         #
# "turn" is the current turn i                                            #
# you may use the tuple t to access the previous exchanges :              #
# t[me][i] : what you played at turn #i (i<turn)                          #
# t[1-me][i] : what the other played at turn #i (i<turn)                  #
#                                                                         #
# Have fun, etc                                                           #
#                                                                         #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 



version='0.1'

# here we go
if __name__=="__main__":
	import sys, code, imp
	# the code to load the emulator has been shamelessly stolen from scapy
	# http://www.cartel-securite.fr/pbiondi/scapy.html
	ipridi_mod = sys.argv[0][sys.argv[0].rfind("/")+1:]
	if not ipridi_mod:
		ipridi_mod = "ipridi"
	else:
		if ipridi_mod.endswith(".py"):
			ipridi_mod = ipridi_mod[:-3]
	ipridi=imp.load_module("ipridi",*imp.find_module(ipridi_mod))
	__builtins__.__dict__.update(ipridi.__dict__)
	code.interact(banner="- Welcome to ipridi ! -\n   h() for help")
	print "Bye !"
	sys.exit(0)

import sys,re,random
turnspergame=20
payoff=[[1,1],[5,0]],[[0,5],[3,3]]
t=[[],[]]

def fight(fst, snd, verbose=False):
	"""fight(s p1, s p2, b verbose)
gives the result of the match p1 vs p2"""
	if not fst in lsp() or not snd in lsp():
		print "Uh-oh... one of the two players doesn't exist !"
		return
	# to do : add a "control" routine detecting
	# trivial attempts to cheat
	global t
	t=[[],[]]
	s=[0,0]
	for i in range(turnspergame):
		# "protection"
		t,s=tuple(t),tuple(s)
		#game
		a,b=globals()[fst](i,0),globals()[snd](i,1)
		# un-protection
		t,s=list(t),list(s)
		t[0].append(a); t[1].append(b)
		if verbose:
			print "%-5s : "%(i), t[0][i], t[1][i]
		# score update
		s[0]+=payoff[t[0][i]][t[1][i]][0]
		s[1]+=payoff[t[0][i]][t[1][i]][1]	
	return s[0],s[1]

def tournament(l):
	"""tournament(l participants)
tournament between the given participants"""
	score=[]
	for i in range(l.__len__()):
		score+=[0]
	for i in range(l.__len__()): 
		for j in range(l.__len__()):   
			si,sj=fight(l[i],l[j])
			score[i]+=si
			score[j]+=sj
	def cmpscores(x,y):
		return x>y and -1 or 1
	# kinda "Schwartzian transform" :)
	final=zip(score,l)
	final.sort(cmpscores)
	cx=1
	for i in range(l.__len__()):
		print  "%-3s"%(1 and a or ""),"%-15s : "%(final[i][0]), final[i][1]
		cx+=1
	return 
	
def lsp():
	"""lsp()
gives the list of all available players"""
	# actually, lsp() looks for functions in the
	# source and assumes they are robots, nothing more
	f=open(sys.argv[0])
	fcts=[re.sub("\(.*","",re.sub("def ","",line))\
	for line in f.read().split("\n") if re.search("^def ",line)!=None]
	pl=fcts[fcts.index('sucker'):]
	f.close()
	return pl

def tpg(n):
	"""tpg(i n)
set the number of turns per game to n"""
	global turnspergame
	turnspergame=n
	return

def about():
	"""about()
gives info about the ipridi program"""
	print "ipridi v",version,"\nby Little Neo"
	print "http://submoon.freeshell.org/en/ipridi"	

def h():
	"""h()
gives ipridi commands"""
	print "Welcome to the zupa built-in help system !"
	for c in [h,tpg,lsp,fight,tournament,about]:
		cd=c.__doc__.split("\n",1)
		print "%-30s : "%(cd[0]), cd[1]

################ the players ##################

# if you look at lsp(), you see that sucker should be the 1st player...
def sucker(turn, me):
	""" sucker always cooperates"""
	return 1

def meanie(turn, me):
	""" meanie always defects"""
	return 0

def rnd(turn,me):
	""" rnd cooperates or defects randomly"""
	return random.choice([0,1])

def tft(turn, me):
	""" tft is Anatol Rapoport's Tit for Tat
 Note he can't beat his opponent"""
	return turn==0 and 1 or t[1-me][turn-1]

def tftz(turn, me):
	""" like tft, but defects at the 1st turn"""
	return turn>0 and t[1-me][turn-1] or 0

def ntft(turn, me):
	""" ntft plays the opposite of what the partner played"""
	return turn==0 and 1 or 1-t[1-me][turn-1]

def tf2t(turn,me):
	""" tf2t cooperates except if the other defected during both precedent turns"""
	return turn<2 and 1 or (t[1-me][turn-1]+t[1-me][turn-2]>0 and 1 or 0)

def avenger(turn,me):
	""" avenger cooperates until the other defects (Friedman)"""
	if (turn==0):
		return 0
	for i in range(turn-1):
		if t[1-me][i]==0:
			return 0
	return 1
	
def cheater(turn,me):
	# illustrates how ipridi could be abused :D
	""" cheats !"""
	global t
	t=list(t)
	if turn>0:
		t[me][turn-1]=1
	t=tuple(t)
	return 0

################### END OF FILE ######################


Little Neo + code2html, 2005

ipridi

Home