程序员侦探系列—刑侦推理题

2018-03-05  本文已影响0人  PrivateEye_zzy

题目来自于2018年江苏省招聘刑侦警察的推理笔试题,题目如下

刑侦推理题

阅读题目后,显然这是10个前后逻辑严谨的推理题,基于程序员本能可以大致抽象出两点

(1):题目中的选项答案,即是其自身的答案(如第一题,第二题等)

(2):题目中的选项答案,指的是答案中对应题目的答案,即答案中的答案(如第三题,第四题得分)

显然,这个题目可以单纯的靠着逻辑学和排除法,用笔和纸通过假设推导或者画图推理出来。但是作为程序员,显然应该通过编程的方法(趣味编程),来寻找那唯一的真相

根据题目分析,我们可以轻松的抽象出其数学模型:无非是编写一个逻辑函数,这个函数接收一个随机的答案排列为输入,然后经过有限个逻辑约束来判断,中途只要违背一个条件约束,就返回False来重新接受新的随机答案排列,如果到最后都没有违背任意一个条件约束,就返回True,即证明输入的答案排列就是其真实的答案排列

下面我们来构造逻辑函数judge(inputs),形参inputs代表输入随机答案排列,而函数里的有限个逻辑约束就是这10个题目要求,我们需要将这些题目翻译成逻辑代码

在翻译之前,我们定义两个表达式来表达上面抽象出的两点

select[answer]:指的是该题自身的答案

inputs[select[answer]]:指的是答案中答案(题目)的答案,或者是第select[answer]个题目对应的答案

对于第1题没什么可以翻译的,我们从第2题分析,第2题的要求是第5题的答案是什么,也就是说如果第2题的答案不是第5题的答案,则这组答案一定错误,则我们可以编写

第二题翻译

同理,分析第3题,要求选择的答案对应题目的答案,不在剩余答案所对应的题目的答案里

第三题翻译

分析第4题,要求选择的答案对应题目的答案应该一致

第四题翻译

分析第5题,要求选择的答案对应题目的答案应该等于第5题自身的答案

第五题翻译

分析第6题,要求选择的答案对应题目的答案应该等于第8题自身的答案

第六题翻译

分析第7题,要求其自身的答案等于所有题目里选项最少的答案

第7题翻译

分析第8题,要求选择的答案对应题目的答案,应该和第1题的答案不相邻

第8题翻译

分析第9题,要求"选择的答案对应题目的答案和第5题的答案是否相同"与"第1题和第6题的答案是否相同"互斥

第9题翻译

分析第10题,要求其自身的答案等于所有题目里答案出现次数最少的次数

第10题翻译

至此我们完成了对这10个逻辑约束的翻译,也完成了逻辑函数的编程,还有一点值得注意,题目答案的编码,我们利用了0123带代表ABCD,这样方便我们可以直接作为数组索引来寻址到任意一个题目的答案,也方便我们用加减法计算是否相邻

最后,只要利用计算机算力的高性能,使用穷举法跑我们的逻辑函数,就可以在有限的时间内找到真正的答案(由于使用了穷举法,答案的输入是完全随机的,所以计算时间也是不一定的)

消耗5秒找到真相 消耗1.6秒找到真相

从结果上可以看到,计算机成功扮演了侦探角色,很快的找到了唯一的真相!

也可以看出,程序员 > 侦探

案例代码见:刑侦推理题

上一篇下一篇

猜你喜欢

热点阅读