# boltz2qn

This program has been disqualified.

 Author kera Submission date 2017-07-20 10:50:38.585440 Rating 7112 Matches played 27 Win rate 77.78

## Source code:

``````import random
import math

def calcOutput(hist):
q = [0 for k in range(3)]
for i in range(0,3):
q[i] = 1*w[i][c*9];
for k in range(0,c*9):
q[i] = q[i] + hist[k] * w[i][k]
return q

def cvtHand(a):
if a == 0:
return 'R'
if a == 1:
return 'P'
if a == 2:
return 'S'

def cvtNum(a):
if a == 'R':
return 0
if a == 'P':
return 1
if a == 'S':
return 2

def calcHand(q):
er = math.exp(b*q[0])
ep = math.exp(b*q[1])
es = math.exp(b*q[2])
br = er / (er+ep+es)
bp = ep / (er+ep+es)
bs = es / (er+ep+es)
rand = random.random()
if(rand < br):
return 'R'
elif(rand < br+bp):
return 'P'
else:
return 'S'

def calcNextHist(op):
nextHist = []
nextHist.extend(hist)
del nextHist[0:9]
oph = [0 for k in range(3)]
oph[cvtNum(op)] = 1
nextHist = nextHist+oph+[0 for k in range(6)]
return nextHist

def maxA(tmp):
ret = tmp[0]
for i in range(1,len(tmp)):
if ret < tmp[i]:
ret = tmp[i]
return ret

def calcTeacher(op):
teacher = [0 for k in range(3)]
nHist = calcNextHist(op)
winHandNum = (cvtNum(op)+1)%3
loseHandNum = (cvtNum(op)+2)%3
for i in range(0,3):
nHist[c*9-6+i] = 1
if winHandNum == i:
nHist[c*9-3+0]=1
elif loseHandNum == i:
nHist[c*9-3+1]=1
else:
nHist[c*9-3+2]=1
teacher[i] = g*maxA(calcOutput(nHist))
nHist[c*9-6+i] = nHist[c*9-3+0] = nHist[c*9-3+1] = nHist[c*9-3+2]=0

if winHandNum == i:
teacher[i] += 1
if loseHandNum == i:
teacher[i] -= 1
return teacher

def learn(op):
dw = 0.000001
idw = 1.0 / dw
teacher = calcTeacher(op)
out = calcOutput(hist)
for i in range(0,3):
oriError = pow(teacher[i] - out[i],2)/2
error = pow(teacher[i] - out[i]+dw,2)/2
w[i][c*9] += (error-oriError) * idw * r
for j in range(0, c*9):
w[i][j] += hist[j] * (error-oriError) * idw * r

def updateHist(op, my, h):
oph = [0 for k in range(3)]
myh = [0 for k in range(3)]
reh = [0 for k in range(3)]
del h[0:9]
oph[cvtNum(op)] = 1
myh[cvtNum(my)] = 1
if (cvtNum(op)+1)%3 == cvtNum(my):
reh[0] = 1
elif (cvtNum(op)+2)%3 == cvtNum(my):
reh[1] = 1
else:
reh[2] = 1
for i in range(0,3):
h.append(oph[i])
for i in range(0,3):
h.append(myh[i])
for i in range(0,3):
h.append(reh[i])

if input == '':
c = 7
g = 0.5
r = 1.0/(c*3+1) * 2.0
b = 2
w = [[0 for k in range(c*9+1)]for j in range(3)]
hist = [0 for k in range(9*c)]
else:
learn(input)
updateHist(input, oldOutput, hist)

output = calcHand(calcOutput(hist))
oldOutput = output``````