Python算法设计 – 猜数字

  • Post author:
  • Post category:python




一、游戏介绍

给出一个四位数字(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 版权协议,转载请附上原文出处链接和本声明。