程序员侦探系列—刑侦推理题
题目来自于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秒找到真相从结果上可以看到,计算机成功扮演了侦探角色,很快的找到了唯一的真相!
也可以看出,程序员 > 侦探
案例代码见:刑侦推理题