码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-06-12 22:24:42      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:div   IV   AC   改进   rod   试题   解决   代码   一个   

在网上看到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行代码

标签:div   IV   AC   改进   rod   试题   解决   代码   一个   

原文地址:https://www.cnblogs.com/babihuang/p/9172113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!