c

codeye

V1

2022/09/22阅读:20主题:默认主题

2个人说谎,2人说真话

函数statement(person) 运用字典结构初始化每个人的申明:

values是包含2个元素的列表, 角标位置为 0 :此人说谎 角标位置为 1: 此人说真话

输出 字典结构sates.keys是['A','B','C','D']

def statement(person):
    states = dict(zip(person,[]*len(person)))
    states['A'] = ['A',['B','C','D']]
    states['B'] = [['A','B','C'],"D"]
    states['C'] = [['A','C','D'],"B"]
    states['D'] = ['D',['A','B','C']]
    return states
person = ['A','B','C','D']
print(statement(person))

主函数 find(state, true_man) 函数find传入参数state是子函数statement返回结果 缺省true_man时,则返回所有遍历结果


def find(state, true_man):
    
    enum = range(int('0b0000',2),int('0b1111',2)+1)
    status = ['{:0>4}'.format(bin(i)[2:]) for i in enum]

    key = list(state.keys())
    ans = {}
    for elem in status:
        sets = set(state[key[0]][int(elem[0])])
        for i, c in enumerate(elem):
            sets &= set(state[key[i]][int(c)])
        ans[elem] = set(sets)
    return [[k,v] for k,v in ans.items() if len(v)]

states = statement(person,states={})

print(find(states,true_man=1))

[['0001', {'A'}], ['1001', {'C'}], 
['1011', {'B'}], ['1100', {'D'}]]

输出结果又一次支持结论:已知只有一个人说真话的前提下,只有['0001', {'A'}符合

再看若有2个人说谎,2人说真话,那么 窃贼只会在'C'和‘D'之间的某一个;

再看若有1个人说谎,3人说真话,那么 窃贼只能是'B'

分类:

后端

标签:

后端

作者介绍

c
codeye
V1