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'假'
好啦,下课!
源码(不推荐下载): 新人冒个泡 {:5_95:}. 111 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}') 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)) 吃了语文差的亏{:10_266:} 刚开始学if语句时候我就想着这个事儿了,本来还想抽空把代码写了。
逛论坛居然看到小师妹已经整理好了。
赞啊。
666 0 {:5_109:} 穷举 新人报道 sadfdasfdsa #题干:现有 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)) 0.0 学习学习
check
沙发
学习一下下
页:
[1]
2