一个月前看到琉璃心仙人先生的《论无聊的人做什么:模仿游戏》,顿觉有趣。对于这种混杂缠绕在一起的问题,我立刻产生一个疑问:
答案是唯一的吗?
如果我来设计这类题目,我的做法是先列一个答案,按照这个答案来设计题目。但是这样做能保证它的唯一性吗?
原作者利用学了一个月的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
]