"""
有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)
python实现老鼠试药(测试版)
猜你喜欢
转载自blog.csdn.net/adsszl_no_one/article/details/105187424
今日推荐
周排行