鱼C-小师妹 发表于 2021-3-23 16:14:08

05 - 谁在骗人?

本帖最后由 鱼C-小师妹 于 2021-3-30 16:03 编辑

如果弄明白上一讲的配对问题,那么这种“逻辑推断”类的问题,解法都大同小异!

核心点就是:

**** Hidden Message *****
条件找到了,代码也就有了。

往往找条件这步最能体现出不同人的“语文功底”差异。

不行,这一讲我们升级下难度,来,看题:

现有 A、B 和 C 三个人,A 说 B 在说谎,B 说 C 在说谎,而 C 说 A 和 B 两人都在说谎。
还是通过编程求出这三个人中到底谁说的是真话,谁说的是假话。

从小师妹的学业生涯经验来看,题目字数越少,坑越多。

A 、B 和 C 三个人都可能说真话,也都可能说假话,那么如何来判断他们到底谁在说谎呢?

由问题描述可得到如下三个结论:


[*]由于“张三说李四在说谎”,因此,如果张三说的是真话,则李四就在说谎;反之,如果张三在说谎,则李四说的就是真话。
[*]由于“李四说王五在说谎”,因此,如果李四说的是真话,则王五就在说谎;反之,如果李四在说谎,则王五说的就是真话。
[*]由于“王五说张三和李四两人都在说谎”,因此,如果王五说的是真话,则张三和李四两人就都在说谎;反之,如果王五在说谎,则张三和李四两人至少一人说的是真话。

这些结论就是一个一个条件~

看到现在,我们应该养成了“条件反射”!

解决这种问题,首先考虑“穷举法”,反正计算机喜欢一个一个的傻算。

先将问题分析中得到的三个分析结果用表达式表达出来。

用变量 x、y 和 z 分别表示张三、李四和王五三人说话真假的情况。

当 x、y 或 z 的值为 1 时表示该人说的是真话。

值为 0 时表示该人说的是假话。

那么上面问题分析中的三个结论可以使用如下的表达式进行表示:


[*]x==1 and y==0张三说的是真话,李四在说谎
[*]x==0 and y==1张三在说谎,李四说的是真话
[*]y==1 and z==0李四说的是真话,王五在说谎
[*]y==0 and z==1李四在说谎,王五说的是真话
[*]z==1 and x==0 and y==0王五说的是真话,则张三和李四两人就都在说谎
[*]z==0 and x+y!=0王五在说谎,则张三和李四两人至少一人说的是真话

我们已经知道,在 Python 中,有了关系运算符和逻辑运算符以后,就可以使用一个逻辑表达式来表达一个复杂的关系。

将上面的表达式进行整理一下就得到如下表达式:

(x and (not y) or (not x) and y) and (y and (not z) or (not y) and z) and (z and x ==0 and y==0 or (not z) and x+y != 0)
上面的每个条件之间都是 or(或)的关系。

好啦,现在只要画出盒图,就离搞定程序不远啦:



正确匹配中还需要加一个 if 语句判断来方便输出,核心代码:

for x in range(2):
      for y in range(2):
            for z in range(2):
                if(x and (not y) or (not x) and y) and (y and (not z) or (not y) and z) and (z and x == 0 and y == 0 or (not z) and x+y != 0):
                  if x == 1:
                        a = '真'
                  else:
                        a = '假'
                  if y == 1:
                        b = '真'
                  else:
                        b = '假'
                  if z == 1:
                        c = '真'
                  else:
                        c = '假'
                  print("张三说的是{}话".format(a))
                  print("李四说的是{}话".format(b))
                  print("王五说的是{}话".format(c))
结果:



搞定!

别急,以为下课了吗?!

没觉得上面代码中 if/else 有点冗余吗?

对于新手来说虽然上面的结构很易于理解,但是!

高阶程序员是不会这么写的,内行人一看就知道你还不够牛~

现在小师妹教给大家一种“高级”写法,只需执行一条语句就可以!

像这种:
if x>0:
        y=x
else:
        y=-x;       
我们可以简化为:

y= x if x>0 else -x
一行代码搞定,是不是格调满满~

执行过程其实还和上面一样:


[*]如果 x>0 条件为真,则条件表达式的值为 x,即 y=x
[*]如果条件为假,则条件表达式的值为 -x,则 y=-x

代码就可以优化成这样:

a = '真' if x == 1 else'假'
b = '真' if y == 1 else'假'
c = '真' if z == 1 else'假'
好啦,下课!

源码(不推荐下载):

梦入天机 发表于 2021-3-23 16:15:57

新人冒个泡

龙舞九天 发表于 2021-5-31 14:05:07

{:5_95:}.

calrai11 发表于 2021-6-8 15:25:46

111

zhangyuesd 发表于 2021-6-21 15:24:24

T = ['真话', '假话']
li = [ for A in T
            for B in T
            for C in T]
for x in li:
    if x != x and x != x and x != T:
      print(f'A是{x}, B是{x}, C是{x}')

mzxmzx 发表于 2021-7-6 21:06:13

for x in range(2):
      for y in range(2):
            for z in range(2):
                if(x and (not y) or (not x) and y) and (y and (not z) or (not y) and z) and (z and x == 0 and y == 0 or (not z) and x+y != 0):
                  a = '真' if x == 1 else'假'
                  b = '真' if y == 1 else'假'
                  c = '真' if z == 1 else'假'
                  print("张三说的是{}话".format(a))
                  print("李四说的是{}话".format(b))
                  print("王五说的是{}话".format(c))

旗鱼骑士的旗鱼 发表于 2021-8-29 11:46:03

吃了语文差的亏{:10_266:}

掉sai的黑键 发表于 2021-9-3 10:27:22

刚开始学if语句时候我就想着这个事儿了,本来还想抽空把代码写了。
逛论坛居然看到小师妹已经整理好了。
赞啊。

yuzhangdean 发表于 2021-10-9 20:21:02

666

若木之 发表于 2021-10-17 12:49:29

0

kcyyyy 发表于 2021-10-22 20:33:21

{:5_109:}

纯水货 发表于 2021-11-28 16:16:03

穷举

a8580268520 发表于 2022-1-11 09:54:54

新人报道

pipikali 发表于 2022-4-10 17:38:54

sadfdasfdsa

Hyjxsssss 发表于 2022-5-4 13:30:42

#题干:现有 A、B 和 C 三个人,A 说 B 在说谎,B 说 C 在说谎,而 C 说 A 和 B 两人都在说谎。

# A True --> B False
# A False --> B True

# B True --> C False
# B False--> C True

# C True --> A & B False
# C False --> A or B True


result = ['True', 'False']
for A_r in result:
    for B_r in result:
      for C_r in result:
            if (A_r == 'True' and B_r == 'False') or (A_r == 'False' and B_r == 'True'):
                if (B_r == 'True' and C_r == 'False') or (B_r == 'False' and C_r == 'True'):
                  if (C_r == 'True' and A_r == 'False' and B_r == 'False' or ((A_r == 'True' or B_r == 'True') and C_r == 'False')):
                        ar = '真' if A_r == 'True' else '假'
                        br = '真' if B_r == 'True' else '假'
                        cr = '真' if C_r == 'True' else '假'
                        print('A说的是%s话\nB说的是%s话\nC说的是%s话' % (ar, br, cr))

cscscscs 发表于 2022-5-23 15:35:52

0.0

罗天才 发表于 2022-11-22 10:39:57

学习学习

xier00 发表于 2023-3-13 20:40:37

check

Alexiiis 发表于 2023-5-31 22:02:03

沙发

pingkong 发表于 2023-11-2 08:49:46

学习一下下
页: [1] 2
查看完整版本: 05 - 谁在骗人?