发布于 2018-12-23 23:03:31
这个机器人遵循两个玩家版本的最优策略,只使用它的得分和最佳对手的得分。在最后一轮中,更新版本考虑了所有分数。
class OptFor2X(Bot):
_r = []
_p = []
def _u(self,l):
res = []
for x in l:
if isinstance(x,int):
if x>0:
a=b=x
else:
a,b=-2,-x
else:
if len(x)==1:
a = x[0]
if a<0:
a,b=-3,-a
else:
b=a+2
else:
a,b=x
if a<0:
res.extend((b for _ in range(-a)))
else:
res.extend(range(a,b+1))
res.extend((res[-1] for _ in range(40-len(res))))
return res
def __init__(self,*args):
super().__init__(*args)
if self._r:
return
self._r.append(self._u([[-8, 14], -15, [-6, 17], [18, 21], [21],
-23, -24, 25, [-3, 21], [22, 29]]))
self._r.extend((None for _ in range(13)))
self._r.extend((self._u(x) for x in
([[-19, 13], [-4, 12], -13, [-14], [-5, 15], [-4, 16],
-17, 18],
[[-6, 12], [-11, 13], [-4, 12], -11, -12, [-13], [-14],
[-5, 15], -16, 17],
[11, 11, [-10, 12], -13, [-24], 13, 12, [-6, 11], -12,
[-13], [-6, 14], -15, 16],
[[-8, 11], -12, 13, [-9, 23], 11, [-10], [-11], [-12],
[-5, 13], -14, [14]],
[[-4, 10], [-11], 12, [-14, 22], 10, 9, -10, [-4, 11],
[-5, 12], -13, -14, 15],
[[-4, 10], 11, [-18, 21], [-9], [-10], [-5, 11], [-12],
-13, 14],
[[-24, 20], [-5, 9], [-4, 10], [-4, 11], -12, 13],
[[-25, 19], [-8], [-4, 9], [-4, 10], -11, 12],
[[-26, 18], [-5, 8], [-5, 9], 10, [10]],
[[-27, 17], [-4, 7], [-5, 8], 9, [9]],
[[-28, 16], -6, [-5, 7], -8, -9, 10],
[[-29, 15], [-5, 6], [-7], -8, 9],
[[-29, 14], [-4, 5], [-4, 6], [7]],
[[-30, 13], -4, [-4, 5], 6, [6]],
[[-31, 12], [-5, 4], 5, [5]],
[[-31, 11], [-4, 3], [3], 5, 6],
[[-31, 10], 11, [-2], 3, [3]],
[[-31, 9], 10, 2, -1, 2, [2]],
[[-31, 8], 9, [-4, 1], [1]],
[[-30, 7], [7], [-5, 1], 2],
[[-30, 6], [6], 1],
[[-31, 5], [6], 1],
[[-31, 4], [5, 8], 1],
[[-31, 3], [4, 7], 1],
[[-31, 2], [3, 6], 1],
[[-31, 1], [2, 10]] ) ))
l=[0.0,0.0,0.0,0.0,1.0]
for i in range(300):
l.append(sum([a/6 for a in l[i:]]))
m=[i/6 for i in range(1,5)]
self._p.extend((1-sum([a*b for a,b in zip(m,l[i:])])
for i in range(300)))
def update_state(self,*args):
super().update_state(*args)
self.current_sum = sum(self.current_throws)
def expect(self,mts,ops):
p = 1.0
for s in ops:
p *= self._p[mts-s]
return p
def throw_again(self,mts,ops):
ps = self.expect(mts,ops)
pr = sum((self.expect(mts+d,ops) for d in range(1,6)))/6
return pr>ps
def make_throw(self,scores,last_round):
myscore=scores[self.index]
if last_round:
target=max(scores)-myscore
if max(scores)<40:
opscores = scores[self.index+1:]
else:
opscores = []
i = (self.index + 1) % len(scores)
while scores[i] < 40:
opscores.append(scores[i])
i = (i+1) % len(scores)
else:
opscores = [s for i,s in enumerate(scores) if i!=self.index]
bestop = max(opscores)
target = min(self._r[myscore][bestop],40-myscore)
# (could change the table instead of using min)
while self.current_sum < target:
yield True
lr = last_round or myscore+self.current_sum >= 40
while lr and self.throw_again(myscore+self.current_sum,opscores):
yield True
yield False发布于 2018-12-23 21:03:58
相反,只想知道真相--没有勺子。
NeoBot窥视矩阵(也就是随机的),并预测下一次滚动是否为6--它不能做任何事情--从一开始就被交给6,但是它非常乐意避开一条裸光镜。
NeoBot实际上并不修改控制器或运行时,只是礼貌地向库询问更多信息。
class NeoBot(Bot):
def __init__(self, index, end_score):
self.random = None
self.last_scores = None
self.last_state = None
super().__init__(index,end_score)
def make_throw(self, scores, last_round):
while True:
if self.random is None:
self.random = inspect.stack()[1][0].f_globals['random']
tscores = scores[:self.index] + scores[self.index+1:]
if self.last_scores != tscores:
self.last_state = None
self.last_scores = tscores
future = self.predictnext_randint(self.random)
if future == 6:
yield False
else:
yield True
def genrand_int32(self,base):
base ^= (base >> 11)
base ^= (base << 7) & 0x9d2c5680
base ^= (base << 15) & 0xefc60000
return base ^ (base >> 18)
def predictnext_randint(self,cls):
if self.last_state is None:
self.last_state = list(cls.getstate()[1])
ind = self.last_state[-1]
width = 6
res = width + 1
while res >= width:
y = self.last_state[ind]
r = self.genrand_int32(y)
res = r >> 29
ind += 1
self.last_state[-1] = (self.last_state[-1] + 1) % (len(self.last_state))
return 1 + res发布于 2018-12-22 15:52:04
https://codegolf.stackexchange.com/questions/177765
复制相似问题