R语言解决张三,李四王五说谎的问题

在知乎上看到一个问题,张三说李四在说谎,李四说王五在说谎,王五说张三李四都在说谎。问谁在说谎。用R语言解决。。不得不说,这个问题还是挺有趣的。但是拿到这个问题,我是不知道该怎么办的。不过有大神孙利军给出了答案。如下:

张三、李四和王五,有三个人,每个人均有“说谎”,“说真话”两种可能,故一共有$2^3=8$中可能。这里,通过expand.grid()函数创建一个数据框,包含所有的组合。

1
(df <- expand.grid(zhang = 0:1, li = 0:1, wang = 0:1))
1
2
3
4
5
6
7
8
9
## zhang li wang
## 1 0 0 0
## 2 1 0 0
## 3 0 1 0
## 4 1 1 0
## 5 0 0 1
## 6 1 0 1
## 7 0 1 1
## 8 1 1 1

其中,0代表撒谎,1代表诚实,每一行是一种组合,组合要满足题目中所说的逻辑关系,也就是说:

1
2
3
zhang == !li
li == !wang
wang == (!zhang & !li)
1
2
3
4
5
6
7
apply(df, 1, function(x) {
all(
x['zhang'] == !x['li'],
x['li'] == !x['wang'],
x['wang'] == (!x['zhang'] & !x['li'])
)
})
1
## [1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE

可以看到,第3行结果为TRUE,说明第3中组合是符合条件的。因此,答案为张三说谎,王五说谎,李四说真话。

知乎原题传送门:R语言解决张三李四王五说谎问题?