诚实国还是说谎国,谁说假话,谁说实话

我们看一个非常有意思的小问题。

题目:

城实国和说谎国,是两个截然不同的国家。诚实国的人永远说真话,说谎国的人永远说假话。

有一天,你在两个国家的交界处遇到了三个人A,B,C,你想调查一下他们分别来自哪个国家。

其中A说“我们三个人中间有两个来自诚实国”。

B说“他说的不对,我们中间只有一个城实国”。

最后C告诉你:B说的对。

请问:你该怎样分辨出他们的国籍?

如果我们不用程序模拟,很快我们就要被搞晕了。大家可能不相信,公务员考试就有很多这样的题目。令人崩溃。

但是......

作为一个学过python的程序员(媛),我们可以尝试一下 ,用python计算出这个问题。


                               代码获取

关注“python趣味爱好者”微信公众号,回复“谁在说谎”获取源代码

算法模拟

1:循环遍历

我们写程序看一看吧

我们用1表示一个人是城实国,0表示这个人来自说谎国。

我们用a,b,c三个变量来表示这三个人的国籍,比如说a=1.代表A来自诚实国。

b=0,代表B来自说谎国。

我们先初始化三个变量。

a=0
b=0
c=0

然后,我们用穷举法循环所有的可能性

代码如下

for i in range(0,2):
    a=i
    for j in range(0,2):
        b=j
        for k in range(0,2):
            c=k
            print("A的国籍",a,"  B的国籍",b,"  C的国籍",c)

遍历所有可能的结果,是这样的

这样,我们就可以将所有的人的身份状态遍历一遍。一共有八种情况。

2:条件判断

在这些各种情况中,我们要找出符合三个人说的要求的图片。为此,我们专门定义了一个函数。用来判断是否符合三种要求。

def judge(a,b,c):
    if((a and a+b+c==2) or ((not a) and a+b+c!=2)) and ((b and a+b+c==1) or ((not b) and a+b+c!=1)) and (c and a+b+c==1) or ((not c) and a+b+c!=1):
        return 1
    else:
        return 0

其中a,b,c是三个形参,分别代表三个人的国籍。

然后,我们用了一个比较复杂的if判断。先假设

除此之外,我们还要定义一个函数,来判断当前的身份状态是否符合题目中的要求,也就是这三个人说的话。

大家仔细阅读一下这一行代码,这是用来描述A说的话的。

((a and a+b+c==2) or ((not a) and a+b+c!=2))

A说他们之间有两个人来自诚实国,那么如果A说的是正确的,那么他就来自诚实国,另外两个人中也有一个来自诚实国,也就是a+b+c=2。其中a=1,b,c之间有一个是1有一个是0。

如果A说的是错的,那么a=0,且a+b+c不等于2。

我们再来看B说的话,B说他们之间只有一个来自诚实国,加入B说的是正确的,那么A说的就是错的。也就是说a=0,b=1,这时候c=0.

同样的道理分析C,我们也可以看出其中的规律,我们把这些约束写在if判断里面。如果满足所有的条件,那么就返回1,否则返回0.

在循环遍历所有的情况的时候,我们调用这个函数,进行判断。

运行结果就是

有两种情况满足

第一种是:

A,B,C说的全部都是谎话,他们都来自说谎国

第二种是:

A和B来自诚实国,C来自说谎国


图片来源:

图怪兽

发表情

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值