【python】请问哪里写错了?

问题是这样的:四个人里有一个隐形股东,对A、B、C、D询问,表述如下:
A:“隐形股东在B、C、D三人之中。”
B:“我不是隐形股东,C是。”
C: “在A和D中间有一个是。"
D: “B说的是事实”
四人中两人说了真话,隐形股东只有一个。

statements = [
    "隐形股东在B、C、D三人之中。",
    "我不是隐形股东,C是。",
    "在A和D中间有一个是。",
    "B说的是事实"
]
for i in range(4):
    for j in range(4):
        if i == j:
            continue
        true_count = 0
        for k in range(4):
            if (k == i) or (k == j and k != 1) or (k == 1 and i != 1 and j != 1) or ("隐形股东" in statements[k] and k != j):
                true_count += 1
        if true_count == 2:
            print("隐形股东是股东" + chr(ord('A')+i))
            break

根据逻辑推理,将四个人分别是隐形股东的情况代入,可以发展d是隐形股东,代码运行出来bcd都是,请问是哪里错了?

把ABCD描述写成函数,代码比较简洁

def funa(n):
    if n==1 or n==2 or n==3:
        return 1
    return 0
def funb(n):
    if n==2:
        return 1
    return 0
def func(n):
    if n==0 or n==3:
        return 1
    return 0
for i in range(4):
    count = funa(i)+funb(i)+func(i)+funb(i)
    if count == 2:
        print(chr(ord('A')+i))

chatgpt:
根据给出的逻辑,我们可以进行以下推理:

假设A说的是真话,那么隐形股东只能是B、C、D中的一个。
假设B说的是真话,那么隐形股东只能是C。
假设C说的是真话,那么隐形股东只能是A或者D。
假设D说的是真话,那么B说的话是真的,因此隐形股东只能是C。
因此,我们可以得出以下结论:

如果隐形股东是B、C、D中的一个,那么只有A说的是真话,因为B、C、D中只有一个是隐形股东,如果B或者C说的是真话,那么隐形股东就不止一个了。
如果隐形股东是A或者D,那么只有C说的是真话,因为在A和D中间只有一个人是隐形股东。
因此,我们可以修改代码如下,考虑这些情况:

statements = [
    "隐形股东在B、C、D三人之中。",
    "我不是隐形股东,C是。",
    "在A和D中间有一个是。",
    "B说的是事实"
]
for i in range(4):
    for j in range(4):
        if i == j:
            continue
        true_count = 0
        for k in range(4):
            if (k == i and "隐形股东" in statements[k] and j != 1 and j != i) or \
               (k == j and "隐形股东" in statements[k] and i != 1 and i != j) or \
               (k != i and k != j and "隐形股东" not in statements[k]) or \
               (k == 1 and "C" in statements[k]) or \
               (k == 0 and ("B" in statements[k] or "C" in statements[k] or "D" in statements[k])) or \
               (k == 2 and (("A" in statements[k] and i == 1 and j == 3) or \
                            ("D" in statements[k] and i == 3 and j == 1))):
                true_count += 1
        if true_count == 2:
            print("隐形股东是股东" + chr(ord('A')+i))
            break


这里我们用了比较长的if语句来表示各种情况,可以仔细阅读一下并理解其中的逻辑关系。在测试代码的时候,我们可以将所有可能的情况都列出来,然后检查输出结果是否正确。