2018年刑侦科推理试题的PYTHON暴力解决38行代码

Posted babihuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018年刑侦科推理试题的PYTHON暴力解决38行代码相关的知识,希望对你有一定的参考价值。

在网上看到2018年刑侦科推理试题,发现这是一个PYTHON很好的练笔程序,所以就暴力求解了一下。

答案:BCACACDABA

技术分享图片

55行代码版本:

def check(l):
    #q2
    t=[2,3,0,1]
    if l[5]!=t[l[2]]:
        return False;
    #q3
    t=[l[3],l[6],l[2],l[4]]
    x=t[l[3]]
    t.pop(l[3])
    if x in t:
        return False;
    #q4
    t=[(l[1],l[5]),(l[2],l[7]),(l[1],l[9]),(l[6],l[10])]
    if t[l[4]][0]!=t[l[4]][1]:
        return False;
    #q5
    t=[l[8],l[4],l[9],l[7]]
    if l[5]!=t[l[5]]:
        return False;
    #q6
    t=[(l[2],l[4]),(l[1],l[6]),(l[3],l[10]),(l[5],l[9])]
    if t[l[6]][0]!=t[l[6]][1] or t[l[6]][0]!=l[8]:
        return False;
    #q7
    t=[2,1,0,3]
    tt=[l.count(0),l.count(1),l.count(2),l.count(3)]
    if tt.index(min(tt))!=t[l[7]]:
        return False;    
    #q8
    t=[l[7],l[5],l[2],l[10]]
    if abs(t[l[8]]-l[1])%3<=1:
        return False;
    #q9
    t=[l[6],l[10],l[2],l[9]]
    if (l[1]==l[6])==(t[l[9]]==l[5]):
        return False;
    #q10
    t=[3,2,4,1]
    if max(l.count(0),l.count(1),l.count(2),l.count(3))-min(l.count(0),l.count(1),l.count(2),l.count(3))!=t[l[10]]:
        return False
    return True

for s1 in range(4):
    for s2 in range(4):
        for s3 in range(4):
            for s4 in range(4):
                for s5 in range(4):
                    for s6 in range(4):
                        for s7 in range(4):
                            for s8 in range(4):
                                for s9 in range(4):
                                    for s10 in range(4):
                                        l=[-1,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10]
                                        if check(l):
                                            print(‘‘.join(chr(i+ord(A)) for i in l[1:]))

 改进后的38行代码版本:

import itertools
def check(l):
    t=[2,3,0,1]  #q2
    if l[5]!=t[l[2]]:
        return False;
    t=[l[3],l[6],l[2],l[4]]    #q3
    x=t[l[3]]
    t.pop(l[3])
    if x in t:
        return False;
    t=[(l[1],l[5]),(l[2],l[7]),(l[1],l[9]),(l[6],l[10])]#q4
    if t[l[4]][0]!=t[l[4]][1]:
        return False;
    t=[l[8],l[4],l[9],l[7]]#q5
    if l[5]!=t[l[5]]:
        return False;
    t=[(l[2],l[4]),(l[1],l[6]),(l[3],l[10]),(l[5],l[9])]#q6
    if t[l[6]][0]!=t[l[6]][1] or t[l[6]][0]!=l[8]:
        return False;
    t=[2,1,0,3]
    tt=[l.count(0),l.count(1),l.count(2),l.count(3)]#q7
    if tt.index(min(tt))!=t[l[7]]:
        return False;    
    t=[l[7],l[5],l[2],l[10]]    #q8
    if abs(t[l[8]]-l[1])%3<=1:
        return False;
    t=[l[6],l[10],l[2],l[9]]    #q9
    if (l[1]==l[6])==(t[l[9]]==l[5]):
        return False;
    t=[3,2,4,1]    #q10
    if max(l.count(0),l.count(1),l.count(2),l.count(3))-min(l.count(0),l.count(1),l.count(2),l.count(3))!=t[l[10]]:
        return False
    return True

a=[[x for x in range(4)] for i in range(10)]
for l in itertools.product(*a):
    l=(-1,)+l
    if check(l):
            print(‘‘.join(chr(i+ord(A)) for i in l[1:]))

 

以上是关于2018年刑侦科推理试题的PYTHON暴力解决38行代码的主要内容,如果未能解决你的问题,请参考以下文章

2018行政科推理试题

乱七八糟:刑侦科推理试题

一类有趣的枚举问题

暑假考试题6:single 单(树上推理)

第十四届蓝桥杯大赛软件组省赛 Python大学A组 个人暴力题解

考试总结 2018-5-1