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

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

8576381-e01926f9fd1546d6.jpg
刑侦推理题

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

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

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

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

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

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

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

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

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

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

8576381-01801dfbd7a6bd47.png
第二题翻译

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

8576381-868388b3d2c31d6b.png
第三题翻译

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

8576381-ee54b07fd78b7759.png
第四题翻译

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

8576381-0743b77fcae55249.png
第五题翻译

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

8576381-09232bbe954c3f36.png
第六题翻译

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

8576381-88015aec3de1b649.png
第7题翻译

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

8576381-628e59a6f903e912.png
第8题翻译

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

8576381-22560b527deeda43.png
第9题翻译

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

8576381-5290c87e38e5f23a.png
第10题翻译

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

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

8576381-fda40238fcae8f9f.png
消耗5秒找到真相
8576381-54e694b41ab81fac.png
消耗1.6秒找到真相

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

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

案例代码见:刑侦推理题

猜你喜欢

转载自blog.csdn.net/weixin_33810302/article/details/87226496