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)
发布了45 篇原创文章 · 获赞 9 · 访问量 2252

猜你喜欢

转载自blog.csdn.net/adsszl_no_one/article/details/105187424