一、游戏介绍
给出一个四位数字(X),游戏者猜一个结果(Y),将 X 和 Y 进行对比,提示有多少个数字和位置都正确的叫做 bulls,还提示有多少数字正确但位置不对的叫做 cows,根据这些信息来引导我们继续猜测正确的数字
例如:X:1234
Y:3216
结果 bulls:1(个) cows:1(个),也写成1B1C,B 就是 bulls,C 就是 cows
二、目标
写一个算法,实现生成 X、生成猜测数字 Y、判断 X 是否和 Y 相同的过程
三、Python算法实现
from random import choice, sample
from itertools import permutations
def score(x, y):
bulls = sum(i == j for i, j in zip(x, y))
cows = len(set(x) & set(y)) - bulls
return bulls, cows
def player1(player2):
secret = sample(range(10), 4)
tip = next(player2)
while True:
b, c = score(secret, tip)
if b < 4:
print(b, 'bulls', c, 'cows')
tip = player2.send((b, c))
else:
print('猜中了!')
break
def player2():
tips = list(permutations(range(10), 4))
while True:
tip = choice(tips)
print(tip, '?')
bc = yield tip
tips = [i for i in tips if score(i, tip) == bc]
player1(player2())
注意:
- sample(数据范围,数据长度),该函数能够从指定的数据范围和指定的数据长度返回随机的数据
- itertools.permutations()返回可迭代对象的所有数学全排列方
- choice() 方法返回一个列表,元组或字符串的随机项
- sample()和choice()是模块random中的函数,permutations()函数是itertools模块中的
- 为了减少数据存储,利用yeild构建生成器,与next配合使用,数据用多少,读多少,不需要一次性将所有的数据读进来,yield是一个生成器,生成器中有函数next(),next可以接着上次yield运行的地方,继续运行下面的函数。它与return关键字都有返回函数值的功能
输出结果
版权声明:本文为qq_44000141原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。