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

[ 本帖最后由 caruko 于 2011-2-22 22:22 编辑 ]

TOP

只用了set for echo 3个命令,效率应该还可以=。=,如果不echo,直接得到第100代就更快一点了。我这里大概2分多钟算出来。
原来不用代码,等下直接贴结果。

第100代
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓■▓■▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓■■▓▓▓▓▓■▓■▓▓▓▓■■▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■■▓▓▓▓■■▓■▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓■■▓▓■■▓▓▓▓▓
▓▓▓▓▓▓▓■▓■▓▓▓■▓▓■▓■■■▓▓▓▓
▓▓▓▓▓▓■■▓▓■■■▓▓▓■▓▓■■▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■■■▓■▓■▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓■▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓■■▓▓▓▓▓▓■■▓■■▓▓▓▓▓▓▓▓▓▓
▓▓■■▓▓▓▓▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓■▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓
▓■▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓
■▓■■▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓■■▓▓▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓■■■▓■▓■■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓■▓▓■■■■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓■▓■▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓■▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓


[ 本帖最后由 caruko 于 2011-2-22 23:05 编辑 ]

TOP

代码先上传吧 =。=
到时不知道还记得不,也可能没时间来。
已经更新过,按边角对接算的。

这个代码算法太慢了,已经另写了效率高很多的代码,这个就不设权限了,有意的可以看看。

TOP

=。= 已经按照边角对接修改过了..
输出速度大约是一副图2秒。
不输出的计算速度大约是1.5秒一代。
我的电脑是用了5年的本本,CPU P4M 1.7G的。

效率貌似难以提升了,所有IF判断后再赋值,都是用set /a直接得到结果,效率应该还可以才是。

如果计算中不需要输出,核心循环代码包括FOR(100)的括号在内,可以简化到4行。

[ 本帖最后由 caruko 于 2011-2-23 00:21 编辑 ]

TOP

=.= 我的电脑纯输出2500行就得20秒啊,等会换个电脑试试。
这破机器开龙之谷,每次加载要5分钟,而别的电脑只要15秒。

还有边角问题,是只有4个顶点相连?还是上下边,左右边相连?

难道批处理的纯数值计算更慢?? 回头再想想有没别的办法,减少循环。
这是新的运行结果。

10:46:41.35
10:48:08.14
第100代
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓
▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■
▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓■■▓▓▓▓▓
■■▓▓▓▓▓▓■▓▓▓▓▓▓▓▓■▓▓■▓▓■■
■■■▓▓▓■▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓■
▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓■■■▓▓▓▓
▓▓■■▓▓▓▓▓▓■▓▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓


[ 本帖最后由 caruko 于 2011-2-23 10:52 编辑 ]

TOP

猜想,17秒*25,扣除输出时间,大约是我的运行时间,terse 可能一次计算只循环了25次。。
也就是一行一行的处理?
我也想想,有没可能做到。

[ 本帖最后由 caruko 于 2011-2-23 15:53 编辑 ]

TOP

=.=  仔细一想,经过验证,果然一行一行的计算可行,依靠4次移位来计算细胞和,循环25次得到和,再循环25次替换得到新细胞图。
不知道是不是terse一样的算法,等写出代码试试效率。

呃,不支持近30位的数值计算=。=,难道要切成4段算?

[ 本帖最后由 caruko 于 2011-2-23 16:52 编辑 ]

TOP

换了一种算法,破电脑跑了1分钟,换台双核的应该在40多秒,小有进步=。=

循环代码行数40行 #.#,算法不复杂,只可惜批处理不支持26个字符长度的数值计算,也还没找到好的大数计算方法,目前是把25位数分成4段处理的,导致多出大量的字符数值转换跟计算。

如果支持大数计算,可以节省1/3的时间,如果支持BIT(OR),还能节省1/3时间。

我再优化优化,还有某些地方得出的数值可重用,应该可以节省10多秒。 现在才迫切希望换成64位机来运行它 =.=。

[ 本帖最后由 caruko 于 2011-2-23 22:54 编辑 ]

TOP

优化了代码,运行时间大幅提升,电脑好点,或许可以进入20秒内了。如果能够直接支持26位长度的大数加法,估计只要15秒不到。
下面是运行结果。

第99代
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓■▓
▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓■
▓▓▓▓▓▓■■■▓▓▓▓▓▓▓▓▓■▓▓▓▓▓■
■▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓■▓■■▓▓■■
▓■■▓■■■▓▓▓▓■■▓▓▓▓▓■■■▓▓▓▓
▓▓■■■■▓▓▓▓▓■■▓▓▓▓▓▓■▓▓▓▓▓
▓▓▓■▓▓▓▓▓▓■■■■■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■■▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓
第100代
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓
▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■
▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓■■▓▓▓▓▓
■■▓▓▓▓▓▓■▓▓▓▓▓▓▓▓■▓▓■▓▓■■
■■■▓▓▓■▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓■
▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓■■■▓▓▓▓
▓▓■■▓▓▓▓▓▓■▓▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
0:05:11.00--> 0:05:36.46


[ 本帖最后由 caruko 于 2011-2-24 00:10 编辑 ]

TOP

我的第一个算法是最普遍的,前面那个贴出C代码的算法=。=
只不过我用了大量诸如
判断超标
set /a "x=^!(%%x-1)*25+(%%x-1)" ,当X-1等于0,就让X=25,否着不变。
set /a "x=^!(%%x+1-26)+^!^!(%%x+1-26)*(%%x+1)" 当x+1等于26,就让X=1,否着不变。

重新赋值
set /a "new=^!(sum-3) | ^!(sum-2) * !old!"  ::sum=3,new=1; sum=2,new=old; else new=0
但最后发现,|  之前的可以提速,| 之后的计算,没有比if判断快。

第二个算法是猜想terse的效率,估计他是一行一行处理的,而不是每个坐标都处理。效率提升几十倍只能这么做。

TOP

参赛代码

突然发现结果竟然是错误的。
奇怪,修改了下。这楼删了。
上传的后面跟贴。

[ 本帖最后由 caruko 于 2011-3-8 20:58 编辑 ]

TOP

我之前那个算2分多钟的代码,跟现在16秒的代码,实际算法差不了太多,计算量最多差个2-3倍,没有增加到十倍以上的程度。
但是现在的效率我自己也没想到,只能说,效率跟批处理的特性有关。
换一个语言来写,绝对没有这么大差距,甚至可能在批处理中算的慢的会更快。

TOP

参赛帖

修改了一下,以前是自己直接按图来赋值,改为读取原始图赋值,这样应该正规公平一些吧。
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
1

评分人数

    • netbenton: 批处理编程竞赛 第2011-001期 第三名PB + 20 技术 + 2

TOP

zm的果然很快啊
其实也知道25行的数据很多地方都是重复的,可以重复利用的地方非常多,然而想高重复利用起来计算的复杂度又变高,效率不一定更好,一直没有更好的解决办法,就那样了。

TOP

返回列表