返回列表 发帖
本帖最后由 batman 于 2011-4-21 08:06 编辑

MSG2输出数字,空处是TAB.
写成 #0!n!%%n= 这种八进制数,原来是考虑可能会用到,结果没用上,写成 #!n!#%n%= 则会减少几十个 set。
@echo off&setlocal ENABLEDELAYEDEXPANSION
set /a n=0,m=0
for /f "delims=" %%i in ('more +20 %~f0') do (
    set "str=%%i"
    for /l %%n in (0,1,7) do set "_!RANDOM:~-1!!RANDOM:~-1!#0!n!%%n=!str:~%%n,1!"
    set /a n+=1
)
for /f "tokens=2,3 delims=#=" %%a in ('set _') do (
    set "str=%%a"
    set /a y=m/8,x=m%%8,px=x-!str:~2,1!,py=y-!str:~1,1!,m+=1
    set "msg1=!msg1!%%b"
    set "msg2=!msg2!        !py!:!px!"
    if !x! equ 7 (
        set "msg1=!msg1!&echo/"
        set "msg2=!msg2!&echo/"
    )
)
echo %msg1%%msg2%
goto :eof
我们去北大踢球吧
快上那儿等着信号
你不能离开大门口
生与死就在一瞬间
青春已从身边溜走COPY
1

评分人数

TOP

楼上这个,方法跟我那个差不多吧,只是我用set 排序,你用sort。

最早的时候,我想过一种类似洗扑克牌的乱序方法。

1:随机将后一个字符放在前一个字符的前面或者后面,组合成新的字符串。
2:将新字符串再一次洗牌,循环随机20-40次。(估计了一下40个字符20次差不多能做到足够乱序了)

只是思路的一种吧,细想了一下,发现效率不怎么高,就没继续了。

TOP

本帖最后由 caruko 于 2011-4-22 14:07 编辑

这个在随机排序大量文本的时候是不错,没有临时,没有大量变量,但是效率有点低。

1:echo更耗时,增加了echo次数。
2:sort 本身也是很耗内存的,sort /? 帮助命令看一下就能了解。N个排序对象,在SORT里,产生N个变量用来存放是至少的。set的机制不了解,但似乎在变量存放的时候就是有序的。
3:“ | sort + for”,echo完所有内容进入管道后,SORT才开始排序,SORT排序完并输出所有内容后,FOR开始读取。 所以耗时成倍增加。

TOP

的确,变量的增加让批处理速度变慢,但好像变慢的是变量读取速度,在频繁读取变量的时候差距就越大。

原因猜想:
可能真的是因为变量有序存放的原因?类似数据库?
不像一般的程序语言机制,只是增加内存消耗,没有明显增加读取耗时。

TOP

我写了这个测试代码
@echo off&setlocal ENABLEDELAYEDEXPANSION
for /l %%i in (1,1,10000) do set /a _%%i=%%i
echo !time!
for /l %%i in (1,1,10000) do set /a _1+=2
echo !time!
for /l %%i in (1,1,10000) do set /a _%%i+=2
echo !time!COPY
同样是1万个变量
1:只读取一个变量进行计算,耗时6秒。
2:所有变量都读取进行计算,耗时16秒。

TOP

返回列表