鱼C论坛

 找回密码
 立即注册
查看: 7998|回复: 20

[技术交流] 05 - 谁在骗人?

[复制链接]
发表于 2021-3-23 16:14:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

核心点就是:

游客,如果您要查看本帖隐藏内容请回复

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

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

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

现有 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(或)的关系。

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

谁在骗人.jpg

正确匹配中还需要加一个 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))
结果:

2021-03-26_20-14-09.jpg

搞定!

别急,以为下课了吗?!

没觉得上面代码中 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'假'
好啦,下课!

源码(不推荐下载): whoLie.py.zip (717 Bytes, 下载次数: 16, 售价: 8 鱼币)

评分

参与人数 2荣誉 +10 鱼币 +3 贡献 +6 收起 理由
bool想学C + 5 + 3 鱼C有你更精彩^_^
睦ちゃん她爹 + 5 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-23 16:15:57 | 显示全部楼层
新人冒个泡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-31 14:05:07 | 显示全部楼层
.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-8 15:25:46 | 显示全部楼层
111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-21 15:24:24 | 显示全部楼层
T = ['真话', '假话']
li = [[A,B,C] for A in T
              for B in T
              for C in T]
for x in li:
    if x[0] != x[1] and x[1] != x[2] and x[2] != T[0]:
        print(f'A是{x[0]}, B是{x[1]}, C是{x[2]}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-8-29 11:46:03 | 显示全部楼层
吃了语文差的亏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-3 10:27:22 | 显示全部楼层
刚开始学if语句时候我就想着这个事儿了,本来还想抽空把代码写了。
逛论坛居然看到小师妹已经整理好了。
赞啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 20:21:02 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-17 12:49:29 | 显示全部楼层
0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-22 20:33:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-28 16:16:03 | 显示全部楼层
穷举
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-11 09:54:54 | 显示全部楼层
新人报道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 17:38:54 | 显示全部楼层
sadfdasfdsa
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-23 15:35:52 | 显示全部楼层
0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-22 10:39:57 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-13 20:40:37 | 显示全部楼层
check
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 22:02:03 | 显示全部楼层
沙发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-2 08:49:46 | 显示全部楼层
学习一下下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 21:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表