best_of_*3.1

This program has been disqualified.


Authorgaiasabre11
Submission date2011-05-23 21:41:08.769647
Rating7010
Matches played153
Win rate69.93

Source code:

import math
import random

lastmatch=0

r = random.randrange(0,100)
if not input:
	lloutput = 'P'
	loutput = output = 'P'
	num = 0;
	prob = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
        olast = 0
        ilast = 0
        urmoves=""
	mymoves=""
	output = random.choice(['R','P','S'])
	matchHistory = ""
else:
	matchHistory += input
	if num<3:
		output = 'P'
		num+=1;
	elif input == {'R':'P','P':'S','S':'R'}[lloutput]:
		output = {'R':'S','P':'R','S':'P'}[loutput]
	elif input == {'R':'S','P':'R','S':'P'}[lloutput]:
		output = {'R':'R','P':'P','S':'S'}[loutput]
	elif input == {'R':'R','P':'P','S':'S'}[lloutput]:
		output = {'R':'P','P':'S','S':'R'}[loutput]
	ilast = {'R':0, 'P':1, 'S':2}[input]
        ind = 6*oprev + 2*iprev
        prob[ind] *= 0.95
        prob[ind+1] *= 0.95
        if ilast < 2:
            prob[ind+ilast] += 0.05
        urmoves+=input
lloutput = loutput
loutput = output

ind = 6*olast + 2*ilast
rateR = math.exp(5*(1-prob[ind]-2*prob[ind+1]))
rateP = math.exp(5*(2*prob[ind]+prob[ind+1]-1))
rateS = math.exp(5*(prob[ind+1]-prob[ind]))
randNum = random.random()*(rateR+rateP+rateS)

if randNum < rateR and r<20:
    output = "R"
elif randNum < rateR+rateP and r<20:
    output = "P"
elif r<20:
    output = "S"
elif r>=20 and r<50:
	output = random.choice(['R','P','S'])
	for i in range(len(urmoves)-1,20,-1):
		match=0
		j=1
		while mymoves[i-j]==mymoves[len(urmoves)-j]:
			match+=1
			if match>lastmatch:
				lastmatch=match
				output=urmoves[i]
			if match>20:
				break
			j+=1
	
	output =  {'R':'P', 'P':'S', 'S':'R'}[output]
elif r>=50 and r<70:
	index = 0
	limit = 50
	heatR = heatP = heatS = 0
	while index < len(matchHistory)-2:
		index2 = index
		index3 = len(matchHistory)-2
		length = 0
		while index2 >= 0:
			if matchHistory[index2] != matchHistory[index3] or matchHistory[index2+1] != matchHistory[index3+1]:
				break
			index2 -= 2
			index3 -= 2
			length += 1
			if length > limit:
				break
		predict = matchHistory[index+3]
	        energy = math.pow(length+1, math.log(length+1)+1)
	        if predict == 'R':
	                heatP += energy
	                heatS -= energy
	        elif predict == 'P':
	                heatS += energy
	                heatR -= energy
	        else:
	                heatR += energy
	                heatP -= energy
		index += 2
	if heatR > heatP and heatR > heatS:
	    output = "R"
	elif heatP > heatS:
	    output = "P"
	else:
	    output = "S"
	    
matchHistory += output

mymoves+=output

oprev = olast
iprev = ilast
olast = {'R':0, 'P':1, 'S':2}[output]