用Python对刑侦科推理题进行分析
这篇文章主要介绍用Python对刑侦科推理题进行分析,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
刑侦科推理题,不知是谁设计出来的,逻辑严整细致,有耐心看完题目的人就没几个。如果这真是刑警的日常考试题,我觉得他们实在是太厉害了,保证犯罪分子难逃法网。
编程遍历,这个逻辑本身很普通。但程序中有几个有趣的点值得一提。
首先是十道题,每题有4种可能的选项,全部为4^10=1M,约100万种可能,可以利用python的yield功能,避免将这么多中间结果保存起来。
defmakeList(choose,n):ifn==1:forxinchoose:yieldxa=makeList(choose,n-1)foritemina:b=list(item)forxinchoose:c=b.copy()c.append(x)yieldc
另一个问题就是怎样把这些题目和选项完整地形式化。
就不一一讲解了,代码逻辑很清晰,直接上代码。注意:所有加fake的函数,代表对题目的略写,仅保证了选项正确,而没有保证非选项错误。
之所以这样处理,是希望假结果也出现。计算结果表明,第5、6、8使用略写法不会增加新的假结果,只有第4题放开才出现假结果。
为了和题目统一序号,避免出错,使用了1起,所以在列表前面增加了一个空选项。对其他题目不会有影响,但对第7题和第9题须注意一下,排除掉空选项的干扰。
defq1(x):returnTruedefq2(x):i1=x[2]==Aandx[5]==Ci2=x[2]==Bandx[5]==Di3=x[2]==Candx[5]==Ai4=x[2]==Dandx[5]==Breturni1ori2ori3ori4defq3(x):i1=x[3]==Aandx[2]==x[4]==x[6]andx[2]!=Ai2=x[3]==Bandx[2]==x[4]==x[3]andx[6]!=Bi3=x[3]==Candx[3]==x[4]==x[6]andx[2]!=Ci4=x[3]==Dandx[2]==x[3]==x[6]andx[4]!=Dreturni1ori2ori3ori4defq4(x):i1=x[4]==Aandx[1]==x[5]andx[2]!=x[7]andx[1]!=x[9]andx[6]!=x[10]i2=x[4]==Bandx[1]!=x[5]andx[2]==x[7]andx[1]!=x[9]andx[6]!=x[10]i3=x[4]==Candx[1]!=x[5]andx[2]!=x[7]andx[1]==x[9]andx[6]!=x[10]i4=x[4]==Dandx[1]!=x[5]andx[2]!=x[7]andx[1]!=x[9]andx[6]==x[10]returni1ori2ori3ori4defq4_fake(x):i1=x[4]==Aandx[1]==x[5]i2=x[4]==Bandx[2]==x[7]i3=x[4]==Candx[1]==x[9]i4=x[4]==Dandx[6]==x[10]returni1ori2ori3ori4defq5(x):i1=x[5]==Aandx[8]==x[5]andx[4]!=x[5]andx[9]!=x[5]andx[7]!=x[5]i2=x[5]==Bandx[8]!=x[5]andx[4]==x[5]andx[9]!=x[5]andx[7]!=x[5]i3=x[5]==Candx[8]!=x[5]andx[4]!=x[5]andx[9]==x[5]andx[7]!=x[5]i4=x[5]==Dandx[8]!=x[5]andx[4]!=x[5]andx[9]!=x[5]andx[7]==x[5]returni1ori2ori3ori4defq5_fake(x):i1=x[5]==Aandx[8]==x[5]i2=x[5]==Bandx[4]==x[5]i3=x[5]==Candx[9]==x[5]i4=x[5]==Dandx[7]==x[5]returni1ori2ori3ori4defq6(x):i1=x[6]==Aand(x[8]==x[2]==x[4])andnot(x[1]==x[6]==x[8])andnot(x[3]==x[10]==x[8])andnot(x[5]==x[9]==x[8])i2=x[6]==Bandnot(x[8]==x[2]==x[4])and(x[1]==x[6]==x[8])andnot(x[3]==x[10]==x[8])andnot(x[5]==x[9]==x[8])i3=x[6]==Candnot(x[8]==x[2]==x[4])andnot(x[1]==x[6]==x[8])and(x[3]==x[10]==x[8])andnot(x[5]==x[9]==x[8])i4=x[6]==Dandnot(x[8]==x[2]==x[4])andnot(x[1]==x[6]==x[8])andnot(x[3]==x[10]==x[8])and(x[5]==x[9]==x[8])returni1ori2ori3ori4defq6_fake(x):i1=x[6]==Aand(x[8]==x[2]==x[4])i2=x[6]==Band(x[1]==x[6]==x[8])i3=x[6]==Cand(x[3]==x[10]==x[8])i4=x[6]==Dand(x[5]==x[9]==x[8])returni1ori2ori3ori4defq7(x):x0=x[1:]mn=min(x0,key=x0.count)i1=x[7]==Aandmn==Ci2=x[7]==Bandmn==Bi3=x[7]==Candmn==Ai4=x[7]==Dandmn==Dreturni1ori2ori3ori4defq8_fake(x):i1=x[8]==Aandabs(ord(x[7])-ord(x[1]))!=1i2=x[8]==Bandabs(ord(x[5])-ord(x[1]))!=1i3=x[8]==Candabs(ord(x[2])-ord(x[1]))!=1i4=x[8]==Dandabs(ord(x[10])-ord(x[1]))!=1returni1ori2ori3ori4defq9(x):i1=x[9]==Aandxor(x[1]==x[6],x[6]==x[5])i2=x[9]==Bandxor(x[1]==x[6],x[10]==x[5])i3=x[9]==Candxor(x[1]==x[6],x[2]==x[5])i4=x[9]==Dandxor(x[1]==x[6],x[9]==x[5])returni1ori2ori3ori4defq10(x):x0=x[1:]m1=max(x0,key=x0.count)m2=min(x0,key=x0.count)mx=x0.count(m1)mn=x0.count(m2)i1=x[10]==Aandmx-mn==3i2=x[10]==Bandmx-mn==2i3=x[10]==Candmx-mn==4i4=x[10]==Dandmx-mn==1returni1ori2ori3ori4
注意看一下第9题,其中的xor不是python自带的函数,它的定义很简单。
defxor(a,b):return(aorb)andnot(aandb)
最后遍历得到结果:
deftestAnswer(x):a=q1(x)a=aandq2(x)a=aandq3(x)a=aandq4_fake(x)a=aandq5_fake(x)a=aandq6_fake(x)a=aandq7(x)a=aandq8_fake(x)a=aandq9(x)a=aandq10(x)returnaA='A'B='B'C='C'D='D'a=makeList([A,B,C,D],10)c=0forxina:x.insert(0,'')c+=1iftestAnswer(x):print(c,x)print('tested%dtimes'%c)
运行结果
稍做验证即可知道,第一个答案是正确的,第二个即前文所提的假结果。
以上是用Python对刑侦科推理题进行分析的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。