[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

回复 15楼 的帖子

楼上的代码测试过没啊?运行有问题啊。
***共同提高***

TOP

netbenton非call 那个比我的快多了~

技术狂飙28了,遥望~

[ 本帖最后由 523066680 于 2009-11-24 09:02 编辑 ]

TOP

superman ......O(∩_∩)O哈哈~.......

TOP

&&针对以上的代码和方法小结一下:

    1、核心问题 毫无疑问此挑战在实现上难度并不大,也就是说有一定批处理基础的人都
可以解答出来。主要问题就是如何在解答出来的基础上最大限度地提升代码运行效率,这才
是我们所要考虑的核心问题,也是本人出题的初衷。
   
    2、方法分析 对于这样的较大数据比对,一般用到的有两种方法:一是变量赋值法,二
则是findstr查找法。而在这其中本人以为变量赋值法应该算是主流,因为用这种方法无论是
加密还是解密都是非常实用的,同时,这种方法能尽量避免call语法在代码中的出现(现在已
公认call语法在效率上存在问题),所以本人认为解此类问题,变量赋值法应列为首选。

    3、效率分析 本人仅以变量赋值法为例来谈谈如何尽量提高代码运行的效率,那么首先
我们应搞清楚代码在运行时最消耗时间的是哪一部分。像这样的问题,代码运行耗时基本在
变量赋值的过程中,而后面的解析变量给出结果基本都是在4毫秒左右(本机测试),所以如何
节省变量赋值的时间成了提高效率的关键。而针对本题的变更赋值一般会有三种方法:一是
将每个字赋值给变量,这就要构造7176个形如1-1-1-1的变量,这种方法有一个最大的优点
,因为它相当于建造了一个摩尔码和字一一对应的表,我们在解析码或字时只要代入这种对
应关系就可以得出结果,在连续转译大量编码和文字时,这样的方法是最快的也是最好的,
但相对于本题来讲,其效率则是最低的整个时间需要1秒以上(本机测试),同时也是对系统
资源的浪费;二是将母本的内容按行赋值给变量,这就只要构造359个形如1-1的变量,这种
方法能在很大程度上节约系统资源节省时间,整个赋值过程约为8毫秒(本机测试),但相对于
本题来讲,效率还是不如人意;三是将母本的内容按版(部分) 赋值给变量,只要构造1-36
36个变量,对系统资源的节省最高,赋值的效率肯定也是最快的了,但它也有缺点,那就是
整个赋值过程需要采用的技巧很高,同时因为cmd变量最大字节数的限制不适合大型段落的
情况,另外在解析取值给出结果时其过程也是较为复杂的,但无论如何,这种方法还是目前
所出现的解题方案中最好的。
   
    以上言论仅代表个人观点,还请有兴趣探讨的同志都发表下自己的看法。

[ 本帖最后由 batman 于 2009-11-24 10:59 编辑 ]
1

评分人数

***共同提高***

TOP

在思路已经是最简洁的时候,再怎么改,都是空间和时间的互换。
如果还能更节约时间空间,那么一定是思路,或者操作方式上做手脚

本人此时的观点

[ 本帖最后由 523066680 于 2009-11-24 11:06 编辑 ]

TOP

第二次写加密,换个方式,我就用findstr ,不过用一次。
在我的机子上平均 0.35秒
  1. @echo off
  2. echo %time%
  3. setlocal enabledelayedexpansion
  4. set dict=dictionary.txt
  5. set /a sayx=2,act=1,b=1
  6. set "say_1=我想他肯定知道这个地方有段好难走的路"
  7. set "say_2=当敌人冲过来后你就拉响前面的警报"
  8. for /l %%a in (1,1,50) do (set one=111111!one!)
  9. for /l %%a in (1,1,%sayx%) do (
  10. set count=!say_%%a!#%one%
  11. set count=!count:~0,300!
  12. set count=!count:*#=!
  13. set /a count=300!count:1=-1!-1-1
  14. for /l %%n in (0,1,!count!) do (set "str_%%a=!str_%%a!!say_%%a:~%%n,1! ")
  15. set str=!str! !str_%%a!
  16. )
  17. for /f "tokens=1,2,* delims=: " %%a in ('findstr /n /r "%str%" %dict%') do (
  18. set now=%%c
  19. set now=!now:~1!
  20. set /a na=%%a/14+1
  21. set nb=%%b
  22. set nb=!nb:第=!
  23. set nb=!nb:行=!
  24.       for /l %%A in (1,1,%sayx%) do (
  25.          for %%B in (!str_%%A!) do (
  26.          if not "!now:%%B=!"=="!now!" (
  27.              for /l %%n in (0,1,39) do (if "!now:~%%n,1!"=="%%B" set /a count=%%n+1)
  28.              set /a nc=count/8+1,nd=count%%8+1,nd=nd/2
  29.              for %%C in (!na!-!nb!-!nc!-!nd!) do (
  30.                set say_%%A=!say_%%A:%%B= %%C!
  31.              )
  32.              set str_%%A=!str_%%A:%%B=!
  33.          )
  34.          )
  35.       )
  36. )
  37. for /l %%a in (1,1,%sayx%) do (echo !say_%%a! &echo,)
  38. echo %time%
  39. pause
复制代码

[ 本帖最后由 523066680 于 2009-11-24 12:08 编辑 ]
1

评分人数

TOP

呐,那个文字库收藏了,先来一句~

30-6-2-2 31-4-2-2 14-3-2-4 22-9-5-3 30-8-3-1 16-1-3-2 25-9-4-1 28-5-1-2 33-8-4-1 15-10-2-1, 19-9-4-2 11-6-3-3 21-10-1-1 36-8-5-4 10-1-3-4 26-2-3-1.

[ 本帖最后由 523066680 于 2009-11-24 14:16 编辑 ]

TOP

郁闷,可以的啊,你是哪个字?

TOP

呵呵,论坛是因为有了你们才很有气氛,另外5230666680 21楼这个findstr /n /r 用得好啊。
***共同提高***

TOP

回复 16楼 的帖子

15楼的代码这边测试还蛮正常的。
是对单个字转码的。

TOP

解密暂时还不能突破前面代码的效率,但加密肯定是突破了(本机测试11毫秒左右):
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str1=我 想 他 肯 定 知 道 这 个 地 方 有 段 好 难 走 的 路"
  3. set "str2=当 敌 人 冲 过 来 后 你 就 拉 响 前 面 的 警 报 行"
  4. for /f "tokens=1-3 delims=:" %%a in ('findstr /n /r "%str1% %str2%" homebook.txt') do (
  5.     set /a x=%%a%%14,a=%%a/14,b=%%b&set "vars=%%c"
  6.     if !x! neq 0 set /a a+=1
  7.     for %%a in (%str1% %str2%) do (
  8.         if "!vars:%%a=!" neq "!vars!" (
  9.            set "var=!vars!"
  10.            set /a n=0&set "temp=!var:*%%a=!"
  11.            if defined temp for /f "delims=" %%a in ("!temp!") do set "var=!var:%%a=!"
  12.            set "var=!var:-= !"&for %%a in (!var!) do set /a n+=1
  13.            set /a c=n/4+1,d=n%%4
  14.            if !d! equ 0 set /a c-=1,d=4
  15.            set "%%a=!a!-!b!-!c!-!d!"
  16.         )
  17.     )      
  18. )
  19. for %%a in (1 2) do (
  20.     echo 原文:!str%%a!&set /p=密文:<nul
  21.     for %%b in (!str%%a!) do set /p=!%%b! <nul
  22.     echo.
  23. )
  24. pause>nul
复制代码
多亏了随风提出的set "var=!var:*字=!"的思路,用的是新homebook.txt(见楼下)

[ 本帖最后由 batman 于 2009-11-25 04:10 编辑 ]
1

评分人数

***共同提高***

TOP

因为本人的失误使得findstr的运用受到限制,如查找“第、版、行”三个字时会出现错误,所以母本中的第?版,第?行中的汉字都应去掉,现重新上传母本上来,请各位对照修改自己的代码,对不起了。
***共同提高***

TOP

1。我的第二次加密测试过,遇到"版 第 行"不会错的。
   因为我for 的时候提取的参考字符是 "第x版" "第x行" 后面的那些信息,如果刚好是第x版 则提取为空
   接着我后面还有个判断 -- [字符] 是否存在于 [提取的参考字符]   于是只有遇到密文对应的行才会转换。
(另外本人大胆在前面使用字符串 1 化 +1 的方式来计算 字符串长度…… 虽然体积大,
    虽然耗时0.01 秒到0.02秒,不过为了前面设置的时候可以统一,我觉得值了。)

2。netbenton的经过测试遇到这三个字转换也正常的。

3。关于字典嘛,确实做适当的调整会比较方便批处理

4。batman代码测试新homebook.txt  本机0.30 秒 左右

[ 本帖最后由 523066680 于 2009-11-25 10:02 编辑 ]

TOP

回复 28楼 的帖子

其实不修改母本也能正确处理“版、第、行”三个字,只是如上所说要大费一番周章,
如可以通过findstr正则来处理,但这样会影响到处理的效率,所以本人考虑再三还是将
母本进行了处理,以免不必要的麻烦。
另外,楼上的机子怎么比我的慢这么多。。。

[ 本帖最后由 batman 于 2009-11-25 11:43 编辑 ]
***共同提高***

TOP

28楼的肯定是双核cup

虽然批处理运行很“霸时间”,但是双核的cup不管怎样,一个进程只会用一个cup去执行。

[ 本帖最后由 netbenton 于 2009-11-25 12:27 编辑 ]

TOP

返回列表