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:]))

 

转载于:https://www.cnblogs.com/babihuang/p/9172113.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值