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

【练习-064】批处理将自身文本乱序输出

[复制链接]
发表于 2011-4-23 15:01:36 | 显示全部楼层
若给定文本中不存在重字 还是一个FOR里处理就好了 过多CALL 效率有问题
当然 作为另一思路则别论
发表于 2011-4-23 15:10:46 | 显示全部楼层
本帖最后由 zm900612 于 2011-4-23 15:13 编辑

31# terse


算法问题,用call的初衷是解决for参数中不能使用变量的弊端。
不过刚刚想起来,如果不存在重复字符,就可以直接用变量替换而无需用for截取了
发表于 2011-4-23 23:46:13 | 显示全部楼层
29# zm900612
zm900612兄简化后的代码 可以再减少个FOR  两个并一个既可
发表于 2011-4-24 10:50:22 | 显示全部楼层
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 中以八进制、十六进制表示数字的用法我以前想都没想过,真是长见识了,这个新鲜技巧稍加磨砺,必定又是一柄利器。
发表于 2011-4-25 00:25:04 | 显示全部楼层
本帖最后由 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. )
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 04:51 , Processed in 0.020316 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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