python实现老鼠试药(测试版)

"""
  有100瓶药,只有1瓶是有毒的,老鼠吃完药后,需要3天才能生效,
  现在需要3天知道哪一瓶药有毒,至少需要多少只老鼠
"""
"""
  思考:老鼠喝药有两种状态,生(0) 或 死(1)
        这边时间问题未加上,如果6天或8天,该如何来算老鼠的数量(前3天试药的老鼠如果未死,应该可以复用)
        对于getdiepoison根据死老鼠获取毒药编号的返回值,最后要减1,与我预想的值差1,手动加的,不理解
"""


class MouseAndPoison(object):
    """
    有100瓶药,只有1瓶是有毒的,老鼠吃完药后,需要3天才能生效,
    现在需要3天知道哪一瓶药有毒,至少需要多少只老鼠
    """

    def __init__(self, countpoison, days=3):
        self.countpoison = countpoison
        self.days = days

    def getlessmousenum(self):
        """根据毒药的数量判断需要多少只老鼠(老鼠只有两种状态,生或死)"""
        from math import log, ceil
        return ceil(log(self.countpoison, 2))

    def poisonbinnum(self):
        """根据需要老鼠的数量和药的数量,将药编号并转成二进制格式,返回药二进制列表"""
        poisonlistbin = []
        for i in range(1, self.countpoison + 1):
            pbinnum = bin(i).replace("0b", "")
            if len(pbinnum) <= self.getlessmousenum():
                pbinnum = ((self.getlessmousenum() - len(pbinnum)) * "0") + pbinnum
            poisonlistbin.append(pbinnum)
        return poisonlistbin

    def mouseeatpoison(self):
        """根据药的二进制编号,判断老鼠所需要吃那些药才能查出毒药"""
        mouseeatnub = {}
        for d in list(range(0, self.getlessmousenum())):
            mousepoison = []
            for index, poisonbin in enumerate(self.poisonbinnum()):
                needeatpoison = list(poisonbin)[d]
                if needeatpoison != "0":
                    mousepoison.append(index)
            mouseeatnub[d] = mousepoison
        return mouseeatnub

    def getdiemouse(self, poisondienum):
        """根据给出有毒的药,得到那些老鼠会因为毒药而死"""
        mousedielist = []
        for k, v in self.mouseeatpoison().items():
            if poisondienum in v:
                mousedielist.append(k)
        return mousedielist

    def getdiepoison(self, diemouse):
        """根据给出死掉的老鼠,得出毒药的编号"""
        n = len(self.mouseeatpoison())
        poisonnumstart = list("0" * n)
        for i in diemouse:
            try:
                mousenum = int(i)
                poisonnumstart[mousenum] = "1"
            except:
                print("err")
        return int("0b" + "".join(poisonnumstart), 2) - 1


if __name__ == '__main__':
    posionnum = 6
    # 根据药数得到最多需要多少只老鼠
    mouse = MouseAndPoison(posionnum)
    countmouse = mouse.getlessmousenum()
    print(countmouse)

    # 根据毒药的编号,判定死了那几只老鼠
    poisondienum = 2
    silaoshu = mouse.getdiemouse(poisondienum)
    print(silaoshu)

    # 根据死了那几只老鼠判定毒药编号是多少
    # silaoshu = [4]
    duyao = mouse.getdiepoison(silaoshu)
    print(duyao)

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值