kn007 发表于 2010-8-28 10:28:17

[08-28晚更新]求枚举0~9、A~Z、a~z最有效率的算法[添加了新要求]

自己想得代码如下。。。但总觉得不是最有效率的,遂来求教Dim $C,$i
For $i=0 To 9
        $C[$P_i] = Chr(48+$P_i)
Next
For $i=10 To 35
        $C[$P_i] = Chr(55+$P_i)
Next
For $i=36 To 61
        $C[$P_i] = Chr(61+$P_i)
Next要求:
1、只用1个for循环。
2、禁止使用if、Switch、Select判断语句。
3、循环次数不超过62次或更少次。
4、除了_ArrayDisplay,不能使用其他udf,可以用autoit内置函数
5、打乱数组顺序,可多用个for,我自己是就是多用。。。这条随便考虑,或不考虑,不考虑就只能一个for

3mile 发表于 2010-8-28 12:58:09

这样会好一点?也许吧#include <array.au3>
Dim $C,$i
For $i=0 To 9
      $C[$i] = Chr(48+$i)
Next
For $i=10 To 35
      $C[$i] = Chr(55+$i)
                $c[$i+26]=Chr(BitOR($i+55,0x20))
Next
_ArrayDisplay($c)       

kn007 发表于 2010-8-28 13:09:54

这样会好一点?也许吧
3mile 发表于 2010-8-28 12:58 http://www.autoitx.com/images/common/back.gif


    快了少许,不知3mile还有其他想法不?

C.L 发表于 2010-8-28 13:47:44

#include <array.au3>
Dim $c
For $i=48 To 122
        $chr = StringRegExpReplace (Chr($i),'\w','$1')
        If $i = 95 Then ContinueLoop
        If Not $chr Then _ArrayAdd($c,Chr($i))
Next
_ArrayDisplay ($c)

pusofalse 发表于 2010-8-28 15:28:34

这样的题目很有意思啊,如果加几个限制就更有意思了:
1、只用1个for循环。
2、禁止使用if、Switch、Select判断语句。
3、循环次数不超过62次或更少次。

foboy 发表于 2010-8-28 15:43:39

楼主是为了出题考大家还是单纯为了枚举时的效率呢?
如果是单纯为了效率,是不是需要频繁枚举这些字符?
如果是这种情况,可以先定义一个包含这些字符的数组,然后枚举时只要枚举该数组的元素既可。这样就不用每次取字符都转码,效率肯定会高的。
要是单纯是出题研究思路,就当我没说,嘿嘿。

C.L 发表于 2010-8-28 15:55:23

本帖最后由 C.L 于 2010-8-28 15:58 编辑

回复 5# pusofalse

这样的题目很有意思啊,如果加几个限制就更有意思了:
1、只用1个for循环。
2、禁止使用if、Switch、Select判断语句。
3、循环次数不超过62次或更少次


这个条件有点苛刻,呵呵~ 试着做了一下:
$str = ""
For $i=0 To 37
        $a = 48 + $i * 2
        $str &= Chr($a)&Chr($a+1)
Next
$str = StringRegExpReplace ($str,'\W|_','')
MsgBox (0,'',$str)

afan 发表于 2010-8-28 16:25:22

也试下~ foboy 说的也在理~#include <Array.au3>
Local $str, $str1, $str2
For $i=48 To 73
      $str &= Chr($i)
        $str1 &= Chr($i + 17)
        $str2 &= Chr($i + 49)
Next
$a = StringSplit(StringLeft($str, 10) & $str1 & $str2, '')
_ArrayDisplay($a, '$a')

foboy 发表于 2010-8-28 18:36:48

本帖最后由 foboy 于 2010-8-28 18:47 编辑

要求:
1、只用1个for循环。
2、禁止使用if、Switch、Select判断语句。
3、循环次数不超过62次或更少次。
4、除了_ArrayDisplay,不能使用其他udf,可以用autoit内置函数
这样的要求不难,三行代码搞定:For $i = 48 To 109
        ConsoleWrite(Chr($i + ($i > 57) * 7 + ($i > 83) * 6) & @CRLF)
Next实际涉及到运算的只有一行。
除了用于输出结果的ConsoleWrite,实际真正用到的函数只有一个:Chr
只能说是最简洁的, 不敢保证是最高效的,因为多用了2个运算符

kn007 发表于 2010-8-28 22:36:42

顶起,看看还有谁。。。更好。。。

afan 发表于 2010-8-29 01:17:29

打乱…#include <Array.au3>
Local $out, $ts = TimerInit()
For $i = 1 To 75
        $out &= Chr($i + 47)
        $c = Random(1, $i, 1)
        $out = StringTrimLeft($out, $c) & StringLeft($out, $c)
Next
$a = StringRegExp($out, '', 3)
_ArrayDisplay($a, TimerDiff($ts))

foboy 发表于 2010-8-29 10:57:30

循环次数超过限制了

afan 发表于 2010-8-29 11:00:48

本帖最后由 afan 于 2010-8-29 11:02 编辑

回复 12# foboy


    不知道是增加循环减少运算符及判断耗时些,还是减少循环增加运算符及判断耗时些

rolaka 发表于 2010-8-29 12:35:55

本帖最后由 rolaka 于 2010-8-29 13:50 编辑


#include <Array.au3>
$t = TimerInit()
$test = ""
For $i = 65 To 90
      $test &= Chr($i)
      $test &= Chr($i+32)
      $test &= Chr($i-17)
Next
$a = StringSplit(StringRegExpReplace($test, "[^0-9a-zA-Z]", ""), "", 2)
_ArrayDisplay($a, TimerDiff($t))
毫无技术含量...0.3ms...
第一个有错..

反正要求里也没写不能直接写。。。
方案2
#include <Array.au3>
$t = TimerInit()
$str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
$a = StringSplit($str, "", 2)
_ArrayDisplay($a, TimerDiff($t))

xjdjpbp 发表于 2010-8-29 12:53:50

回复 14# rolaka

第一個方案有71組.....

應該只有62才對

第二個方法我想過,不過我不敢po出來

哈哈~怕被砍帳號{:face (319):}
页: [1] 2
查看完整版本: [08-28晚更新]求枚举0~9、A~Z、a~z最有效率的算法[添加了新要求]