再聊autoit和一道逻辑题

提醒:本文最后更新于 4052 天前,文中所描述的信息可能已发生改变,请仔细核实。


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.5

2、A、B相连的一共多少组?
A.1 B.2 C.3 D.4

3、本题答案为?
A.A B.B C.C D.D

4、第8题答案为?
A.D B.C C.B D.A

5、本题和哪题答案相同?
A.7 B.8 C.9 D.10

6、连续3个C排在一起的有几组?
A.3 B.2 C.1 D.0

7、第一题答案为?
A.A B.B C.C D.D

8、本题和哪题答案相同?
A.1 B.2 C.3 D.4

9、如果A=1,B=2,C=3,D=4,那么前5题答案总和为多少?
A.7 B.10 C.13 D.16

10、如果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。
正确答案:1.A;2.B;3.D;4.C;5.C;6.C;7.A;8.B;9.C;10.D。
已经用注释解释每条的想法和构造。分享一下,这个当然不属于什么效率算法,正确来说应该用成独立函数,并且使用Switch...Case...不过这是初学者的水平体现,我觉得有点纪念意义,这是我开始追求效率算法的开端。So,丢出来分享记忆。(其实就是凑文字)

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和一道逻辑题