提醒:本文最后更新于 4040 天前,文中所描述的信息可能已发生改变,请仔细核实。
09年5月是我接触autoit的时候,那个时候我之所以知道autoit是因为我那个时候想为个朋友写个修改ip(包括管理ip列表等)的工具。那个时候,我有一种敏感,就是对于一些安装工具带有自动填ip功能的好奇,通过脱壳等,发现是autoit。那个时候,我便去搜索autoit,也来到了ACN。如今ACN人气大不如从前,不过autoit的独特,还是使得ACN不会没落(未到此时)。
在10年闲着无事的时候翻到09年P版,也就是阚大,曾提出个问题,这个问题据说是微软的一道逻辑题目,我们先不细讨是否为微软所出。我们看下原帖内容:
据说是微软的一道逻辑题目
有兴趣的自己做下看看,很绕的一道题目,与编程中的递归调用有相似处,可能不止一种解法。百度能搜索到题目和答案,但那样没意思,自己做出来才值得庆幸。
10道题目相互制约,请从答案中找答案。
1、答案中(后同)一共有多少个A?
A.2 B.3 C.4 D.52、A、B相连的一共多少组?
A.1 B.2 C.3 D.43、本题答案为?
A.A B.B C.C D.D4、第8题答案为?
A.D B.C C.B D.A5、本题和哪题答案相同?
A.7 B.8 C.9 D.106、连续3个C排在一起的有几组?
A.3 B.2 C.1 D.07、第一题答案为?
A.A B.B C.C D.D8、本题和哪题答案相同?
A.1 B.2 C.3 D.49、如果A=1,B=2,C=3,D=4,那么前5题答案总和为多少?
A.7 B.10 C.13 D.1610、如果A=1,B=2,C=3,D=4,那么后5题答案总和为多少?
A.4 B.7 C.10 D.13
于是用autoit写了点个代码,属于递归类型。当时因为使用了低版本autoit3,无法使用 If not ,效率低了很多。不过为此也由计算机算出了两个答案(当时一直以为答案只有一个,没想到有两个),经确认都为正确答案(计算机强大的体现。。。)。
正确答案:1.A;2.B;3.B;4.C;5.B;6.D;7.A;8.B;9.B;10.D。
已经用注释解释每条的想法和构造。分享一下,这个当然不属于什么效率算法,正确来说应该用成独立函数,并且使用Switch...Case...不过这是初学者的水平体现,我觉得有点纪念意义,这是我开始追求效率算法的开端。So,丢出来分享记忆。(其实就是凑文字)
正确答案:1.A;2.B;3.D;4.C;5.C;6.C;7.A;8.B;9.C;10.D。
HotKeySet('{F6}','_Exit')
Func _Exit()
Exit
EndFunc
_ScanRandomX()
MsgBox(0,'结束','完成运算')
Func _ScanRandomX()
Local $s[10]=[4,4,4,4,4,4,4,4,4,4],$i1,$i2,$i3,$i4,$i5,$i6,$i7,$i8,$i9,$i10,$ReS
For $i1 = 1 To $s[0]
For $i2 = 1 To $s[1]
For $i3 = 1 To $s[2]
For $i4 = 1 To $s[3]
For $i5 = 1 To $s[4]
For $i6 = 1 To $s[5]
For $i7 = 1 To $s[6]
For $i8 = 1 To $s[7]
For $i9 = 1 To $s[8]
For $i10 = 1 To $s[9]
;------------------------------------------这里主要是递推,写1~4,分别10组,也就是1,1,1,1,1,1,1,1,1,1,1、1,1,1,1,1,1,1,1,1,1,2到4,4,4,4,4,4,4,4,4,4(注册了变量$s)。
$s_RandomLength=$i1 & '|' & $i2 & '|' & $i3 & '|' & $i4 & '|' & $i5 & '|' & $i6 & '|' & $i7 & '|' & $i8 & '|' & $i9 & '|' & $i10
;------------------------------------------转换为数组,自己看帮助,不解释了
$s_Length = StringSplit($s_RandomLength, '|',2)
;------------------------------------------开始检测所给数字,对了,1~4分别表示A、B、C、D
$Res=_Check($s_Length)
;------------------------------------------正确便写入文件
If $Res<>'' Then FileWriteLine(@ScriptDir&'\RESULT.txt','正确答案:1.'&$Res[0]&';2.'&$Res[1]&';3.'&$Res[2]&';4.'&$Res[3]&';5.'&$Res[4]&';6.'&$Res[5]&';7.'& $Res[6]&';8.'&$Res[7]&';9.'&$Res[8]&';10.'&$Res[9]&'。'&@CRLF)
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Endfunc
Func _Check($Answer)
;------------------------------------------S、开始,检测。$Answer是答案
If IsArray($Answer)=0 Then Return;(ConsoleWrite('The Answer Is Not Array'))
Local $i,$s=0,$Word[4]=[1,2,3,4];1~4代表A~D
;------------------------------------------1、答案中(后同)一共有多少个A?A.2|B.3|C.4|D.5
For $i=0 To 9;所有答案中有几个是A
If $Answer[$i]=$Word[0] Then $s+=1
Next
If $s=$Answer[0]+1 And $s>0 And $s<6 Then ;判断结果
$s=0
Else
Return;(ConsoleWrite('The Answer 1 Is Wrong'))
EndIf
;------------------------------------------2、A、B相连的一共多少组?A.1|B.2|C.3|D.4
For $i=0 To 8;所有答案中AB连在一起有多少,因为A=1,B=2,所有连在一起是是12
If $Answer[$i]&$Answer[$i+1]=12 Then $s+=1
Next
If $s=$Answer[1] And $s>0 And $s<5 Then ;判断数量是否符合
$s=0
Else
Return;(ConsoleWrite('The Answer 2 Is Wrong'))
EndIf
;------------------------------------------3、本题答案为?A.A|B.B|C.C|D.D
;None ;不用做,因为他的答案可以说是随意的。
;------------------------------------------4、第8题答案为?A.D|B.C|C.B|D.A
If $Answer[3]=5-$Answer[7] Then ;如题所述,其中的5-是因为4题的答案 A=4,B=3,C=2,D=1而设计的,等差数列求的关系式
$s=0
Else
Return;(ConsoleWrite('The Answer 4 Is Wrong'))
EndIf
;------------------------------------------5、本题和哪题答案相同?A.7|B.8|C.9|D.10
For $i=6 To 9;检查是否有题答案相同,后面仍然是数列,因为a1=7,a2=8,应该明白吧?不懂表达
If $Answer[4]=$Answer[$i] And $Answer[4]+6=$i+1 Then $s=1
Next
If $s=1 Then
$s=0
Else
Return;(ConsoleWrite('The Answer 5 Is Wrong'))
EndIf
;------------------------------------------9、如果A=1,B=2,C=3,D=4,那么前5题答案总和为多少?A.7|B.10|C.13|D.16
If $Answer[0]+$Answer[1]+$Answer[2]+$Answer[3]+$Answer[4] = 3*$Answer[8]+4 Then;如题,至于问我为什么等于3*$Answer[8]+4,我只能说也是等差数列算出来的。。。
$s=0 ;另外为什么9题在这呢,因为前5题如果无法等于9题的某个选项,算再多也没用,浪费时间。
Else
Return;(ConsoleWrite('The Answer 9 Is Wrong'))
EndIf
;------------------------------------------6、连续3个C排在一起的有几组?A.3|B.2|C.1|D.0
Local $sString = '',$sSubString='333',$aMatched ;这个不想解释了,如题嘛。。。判断
For $i=0 To 9
$sString&=$Answer[$i]
Next
$aMatched = StringRegExp($sString, $sSubString, 3)
If 4-$Answer[5] = UBound($aMatched) Then
$s=0
Else
Return;(ConsoleWrite('The Answer 6 Is Wrong'))
EndIf
;------------------------------------------7、第一题答案为?A.A|B.B|C.C|D.D
If $Answer[0]=$Answer[6] Then ;无聊之题,不讲
$s=0
Else
Return;(ConsoleWrite('The Answer 7 Is Wrong'))
EndIf
;------------------------------------------8、本题和哪题答案相同?A.1|B.2|C.3|D.4
For $i=0 To 3;好像前面有道相同的,同理
If $Answer[7]=$Answer[$i] And $Answer[7]=$i+1 Then $s=1
Next
If $s=1 Then
$s=0
Else
Return;(ConsoleWrite('The Answer 8 Is Wrong'))
EndIf
;------------------------------------------10、如果A=1,B=2,C=3,D=4,那么后5题答案总和为多少?A.4|B.7|C.10|D.13
If $Answer[5]+$Answer[6]+$Answer[7]+$Answer[8]+$Answer[9] = 3*$Answer[9]+1 Then ; 前面有道类似的就不讲了,等差数列。。。
$s=0
Else
Return;(ConsoleWrite('The Answer 10 Is Wrong'))
EndIf
;------------------------------------------E、完成,检查。
;ConsoleWrite('Great!')
Local $Str1[4]=['A','B','C','D'],$Str2[4]=[1,2,3,4],$s_i;转换为字母,并输出
For $i=0 to 9
For $s_i=0 To 3
If $Answer[$i]=$Str2[$s_i] Then $Answer[$i]=$Str1[$s_i]
Next
Next
Return $Answer
EndFunc
另外已经更新到Wordpress3.7.1。没自动更新啊,还是要手动确认更新。。。
话说凑字数更新文章不容易啊。
转载请注明转自:kn007的个人博客的《再聊autoit和一道逻辑题》
回来买俩烧饼,如果看到卖西瓜的,买一个
结果只买一个烧饼
因为看到卖西瓜的了
@天长地久: 哈哈哈哈,说明不同语言,语法不同
看到这么有营养的博文,而我只能留一句没营养的赞,好过意不去的.
@小怪物: 好吧。。。下次不写这种了
能在枯燥一点么~ 就不能写点流水文,想吐槽都找不到槽点~
@Uncle.E: 额,都写得这么清楚,带注释了、、、
话说我也是au3爱好者(曾经的),还写过几个小工具,现在懒了,提不起神了。
@深蓝: 过了兴奋的时候了
让我这个学奥数的凌乱了
@斌果: 额。。谦虚了!
这一组 1.A;2.B;3.B;4.C;5.B;6.D;7.A;8.B;9.B;10.D。
第8题和第2题和第3题都相同。
我跑完以后剩一组了
@be.truth: 虾米。。 就是说,只得到一组答案?
@kn007: 可能程序里面少了答案互斥的判断
@be.truth: 表示递归遍历虽然是慢点,但准点。
@be.truth: 你那里滑动解锁,表示是手机解不了。没回复成。感觉算法跟我很像哈
@kn007: 呵呵,第一感觉就是暴力来。
@be.truth: 哈哈哈哈
从ACN看到前辈, 过来冒冒泡,想学AU学不动的样子了。
@heroxianf: 慢慢学习就好了