找回密码
 加入
搜索
查看: 7778|回复: 18

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

 火.. [复制链接]
发表于 2010-8-28 10:28:17 | 显示全部楼层 |阅读模式
自己想得代码如下。。。但总觉得不是最有效率的,遂来求教
Dim $C[62],$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
发表于 2010-8-28 12:58:09 | 显示全部楼层
这样会好一点?也许吧
#include <array.au3>
Dim $C[62],$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)        

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-8-28 13:09:54 | 显示全部楼层
这样会好一点?也许吧
3mile 发表于 2010-8-28 12:58



    快了少许,不知3mile还有其他想法不?
发表于 2010-8-28 13:47:44 | 显示全部楼层
#include <array.au3>
Dim $c[1]
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)

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

发表于 2010-8-28 15:28:34 | 显示全部楼层
这样的题目很有意思啊,如果加几个限制就更有意思了:
1、只用1个for循环。
2、禁止使用if、Switch、Select判断语句。
3、循环次数不超过62次或更少次。

评分

参与人数 1金钱 +1 收起 理由
kn007 + 1 要求加上了。

查看全部评分

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

评分

参与人数 1金钱 +1 收起 理由
kn007 + 1 yan研究思路的,XD是不是也来试试

查看全部评分

发表于 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)

评分

参与人数 1金钱 +30 收起 理由
kn007 + 30

查看全部评分

发表于 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')

评分

参与人数 1金钱 +30 收起 理由
kn007 + 30

查看全部评分

发表于 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个运算符

评分

参与人数 3金钱 +110 收起 理由
pusofalse + 50 最期待的解就是这样~学习了~!
Duvet + 30
kn007 + 30 还不错啊。。难怪XD会赚钱啊

查看全部评分

 楼主| 发表于 2010-8-28 22:36:42 | 显示全部楼层
顶起,看看还有谁。。。更好。。。
发表于 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, '[0-9A-Za-z]', 3)
_ArrayDisplay($a, TimerDiff($ts))

评分

参与人数 1金钱 +80 收起 理由
rolaka + 80 我很无耻抄袭了。。。

查看全部评分

发表于 2010-8-29 10:57:30 | 显示全部楼层
循环次数超过限制了
发表于 2010-8-29 11:00:48 | 显示全部楼层
本帖最后由 afan 于 2010-8-29 11:02 编辑

回复 12# foboy


    不知道是增加循环减少运算符及判断耗时些,还是减少循环增加运算符及判断耗时些
发表于 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))
发表于 2010-8-29 12:53:50 | 显示全部楼层
回复 14# rolaka

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

應該只有62才對

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

哈哈~怕被砍帳號
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-17 03:34 , Processed in 0.110395 second(s), 34 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表