更无聊的人做什么:检查模仿游戏的答案

一个月前看到琉璃心仙人先生的《论无聊的人做什么:模仿游戏》,顿觉有趣。对于这种混杂缠绕在一起的问题,我立刻产生一个疑问:

答案是唯一的吗?

如果我来设计这类题目,我的做法是先列一个答案,按照这个答案来设计题目。但是这样做能保证它的唯一性吗?


原作者利用学了一个月的JAVA暴力求解这个问题。我作为非专业人员,用了一个月时间来写下面的一段非JAVA函数,亲手验证一下它的唯一性。结果发现它真的是只有一个,不由得对设计题目的牛逼感到由衷的敬佩。

结果:

ansLst=Tuples[{1,2,3,4},10];

Table[testFun[ansLst[[i]]],{i,1,Length@ansLst}];

Union@%

结果除了False就是这个{2, 3, 1, 3, 1, 3, 4, 1, 2, 1}(非程序员从1开始数数。)

即BCACACDABA。

附录函数:

testFun[x_,mode_:"noDebug"]:=Module[{rule},

rule=Thread[{"A","B","C","D"}->{1,2,3,4}];


option2={"C","D","A","B"};

option2A=option2/.rule;

test2=x[[5]]==option2A[[x[[2]]]];

If[mode=="Debug",Print[test2]];

If[test2==False,Return[test2]];


option3={x[[3]],x[[6]],x[[2]],x[[4]]};

test3=Module[

{lst1,lst2},

lst1=option3[[x[[3]]]];

lst2=Drop[option3,{x[[3]]}];

(Equal@@lst2)&&(lst1!=lst2[[1]])

];

If[mode=="Debug",Print["3->"test3]];

If[test3==False,Return[test3]];


option4={

{x[[1]],x[[5]]},

{x[[2]],x[[7]]},

{x[[1]],x[[9]]},

{x[[6]],x[[10]]}

};

test4=Module[{lst1,lst2},

lst1=option4[[x[[4]]]];

lst2=Drop[option4,{x[[4]]}];

(Equal@@lst1)&&And@@(Unequal@@@lst2)

];

If[mode=="Debug",Print["4->",test4]];

If[test4==False,Return[test4]];


option5={x[[8]],x[[4]],x[[9]],x[[7]]};

test5=Module[{lst1,lst2},

lst1=option5[[x[[5]]]];

lst2=Drop[option5,{x[[5]]}];

(x[[5]]==lst1)&&And@@(Unequal[x[[5]],#]&/@lst2)

];

If[mode=="Debug",Print["5->",test5]];

If[test5==False,Return[test5]];


option6={

{x[[2]],x[[4]]},

{x[[1]],x[[6]]},

{x[[3]],x[[10]]},

{x[[5]],x[[9]]}

};

test6=Module[{lst1,lst2},

option6A=Append[#,x[[8]]]&/@option6;

lst1=option6A[[x[[6]]]];

lst2=Drop[option6A,{x[[6]]}];

condition1=Equal@@lst1;

condition2=And@@(Not/@(Equal@@@lst2));

condition1&&condition2

];

If[mode=="Debug",Print["6->",test6]];

If[test6==False,Return[test6]];


option7={"C","B","A","D"};

test7=Module[{},

option7A=option7/.rule;

countLst=Count[x,#]&/@{1,2,3,4};

xNumMin=Min[countLst];

If[Count[countLst,xNumMin]==1,

Position[countLst,xNumMin][[1,1]]==option7A[[x[[7]]]],

False]

];

If[mode=="Debug",Print[test7]];

If[test7==False,Return[test7]];


option8={x[[7]],x[[5]],x[[2]],x[[10]]};

test8=Module[{lst1,lst2},

lst1=option8[[x[[8]]]];

lst2=Drop[option8,{x[[8]]}];

condition1=Abs[lst1-x[[1]]]!=1;

condition2=And@@(Abs[#-x[[1]]]==1&/@lst2);

condition1&&condition2

];

If[mode=="Debug",Print[test8]];

If[test8==False,Return[test8]];


option9={x[[6]],x[[10]],x[[2]],x[[9]]};

test9=Module[{lst1,lst2},

lst1=option9[[x[[9]]]];

lst2=Drop[option9,{x[[9]]}];

condition1=x[[1]]==x[[6]];

condition2=lst1==x[[5]];

condition3=((#==x[[5]])&/@lst2);

condition1!=condition2&&(Equal@@condition3)&&condition1==condition3[[1]]

];

If[mode=="Debug",Print[test9]];

If[test9==False,Return[test9]];


option10={3,2,4,1};

test10:=Module[{xMin,xMax,lst},

lst=Count[x,#]&/@{1,2,3,4};

{xMin,xMax}={Min@lst,Max@lst};

(xMax-xMin)==option10[[x[[10]]]]

];

If[mode=="Debug",Print[test10]];

If[test10==False,Return[test10]];

x

]

你可能感兴趣的:(更无聊的人做什么:检查模仿游戏的答案)