在网上看到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:]))