[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
若给定文本中不存在重字 还是一个FOR里处理就好了 过多CALL 效率有问题
当然 作为另一思路则别论

TOP

本帖最后由 zm900612 于 2011-4-23 15:13 编辑

31# terse


算法问题,用call的初衷是解决for参数中不能使用变量的弊端。
不过刚刚想起来,如果不存在重复字符,就可以直接用变量替换而无需用for截取了

TOP

29# zm900612
zm900612兄简化后的代码 可以再减少个FOR  两个并一个既可

TOP

33# terse
确实,忽略了


27# neorobin

测试环境中文编码未处理好, 以下用40个英文字母替代中文文本echo off
setlocal enableDelayedExpansion
set nl=^


for /l %%i in (0x100 1 0x127) do set nums=!nums!%%i,
for /l %%i in (40 -1 1) do (
  ...
neorobin 发表于 2011-4-23 00:45

那天测试的时候出错,后来发现是我不小心删了最后一个字符...
今天仔细研究了一下,虽然代码长,但是效率呱呱的,原因是通过将待随机取值的可用序号定义为一条长变量(这招太漂亮了),进而将输出的文字、偏移量各自定为一个长变量,创造出其他算法所无法做到的“干净环境”。而且在for /l 中以八进制、十六进制表示数字的用法我以前想都没想过,真是长见识了,这个新鲜技巧稍加磨砺,必定又是一柄利器。

TOP

本帖最后由 neorobin 于 2011-4-25 01:47 编辑

各位的算法, 我没有仔细研究, 粗略看了下发现大家都用了些一样的技巧或方法,
我写的有些长, 想了下, 下面两段
  1. for /l %%i in (40 -1 1) ...
  2. for %%i in (!ind!) ...
复制代码
可以整合在一起, ind 和 cnt 两个变量省去了, (另外用位运算对 8 求商和余数只是看起来酷点呵, 没什么实质):
  1. for /l %%i in (0 1 39) do (
  2.   set /a "rem=%%i&7, rand=!random!%%(40-%%i)*4
  3.   for %%p in (!rand!) do set get=!nums:~%%p,3!
  4.   set /a "val=get&0xff, lineOffs=(%%i>>3)-(val>>3), colOffs=(%%i&7)-(val&7)
  5.   set "offs=!offs!!lineOffs!:!colOffs! "
  6.   for %%v in (!val!) do set new=!new!!str:~%%v,1!
  7.   if #!rem!==#7 set new=!new!!nl!& set offs=!offs!!nl!
  8.   for %%a in (!get!) do set nums=!nums:%%a,=!
  9. )
复制代码

TOP

返回列表