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

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

本帖最后由 batman 于 2011-4-21 22:25 编辑

出题目的:
  考查文本处理技巧;
  复习变量赋值法;
  加深对%0参数概念的理解。
加分原则:
  满分20分,视情况加分(以思路为重)。
解题要求:
  代码简洁、高效,在本题中不应生成临时文件;
  老手们暂缓出手。
题目如下:
  1、要求编写批处理将下面五行文字置于代码中,并将这五行共40个文字乱序后仍按每行8个字输出(可先输出到a.txt);
  我们去北大踢球吧
  快上那儿等着信号
  你不能离开大门口
  生与死就在一瞬间
  青春已从身边溜走
  2、假如输出后的内容如下:
  口就间边号球在离
  吧那身大一等生大
  死不们溜走去开能
  着瞬从北青春快已
  我踢与门你上信儿
  要求编写批处理列出现在每个文字相对原始文本中的偏移量(行偏移:列偏移),具体形式如死字原始位置为4:3,现在为3:1,偏移量则为-1:-2,而口字的偏移量则为-2:-7,各偏移量的输出用空格格开,一样每行8个。
补充:
  两步可写在一个批内,也可分步写成两个批。
----------------------------------------------
由于本人的失误原始文本中出现了两个边字,现已经改正(其中一个改为了儿字)。。。
***共同提高***

3# qzwqzw
我承认这点,但这题的难度还是比较低的吧,也没看见新手解题,当然这个新手不包括批才入门的。。。
***共同提高***

TOP

本帖最后由 batman 于 2011-4-21 08:20 编辑

1、more +20 %~f0的效率不如skip=20吧。

2、用tab进行简单的对齐,效果不佳。

3、pause都忘记写了。

4、set "msg1=!msg1!&echo/"这句有特色。

5、帮你修改了第一个边字为儿字。
***共同提高***

TOP

本帖最后由 batman 于 2011-4-21 11:41 编辑

乱序思路:
  因为原始文本是5行共40个汉字,所以设置一个code变量,其值为010203...383940。然后每读取一个汉字随机取一次值(初始是对40随机取位置的值),同时将根据随机取得的位置值查找code中对应的值并将汉字存进这个值变量,再从code中删除这个值并将总数值减一,最后所有的汉字都被乱序并储存到了01-40的变量中。
***共同提高***

TOP

难道题意不是已知的。。。
***共同提高***

TOP

10# zm900612
下面是阁下代码的一次运行结果:
就死门离们上吧间
死生就着们踢离大
开我不离儿去去儿
快等北快北我去快
我大大们去们们我
***共同提高***

TOP

本帖最后由 batman 于 2011-4-21 22:34 编辑

期待更多的解。。。。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (101,1,140) do set "a=%%a"&set "code=!code!#!a:~1!#"
  3. set /a num=40&set "#0=&echo,"
  4. for /f "skip=23" %%a in (%~0) do (
  5.     set "str=%%a"&set /a h+=1
  6.     for /l %%a in (0,1,7) do (
  7.         set /a a=!random!%%num,num-=1,a*=4
  8.         for %%b in (!a!) do (
  9.             for %%b in ("!code:~%%b,4!") do (
  10.                 set "a=%%~b"&set "a=!a:#=!"&set "code=!code:%%~b=!"
  11.                 set /a a=1!a!%%100,hm=a/8+1-h,"lm=(a-1)%%8-%%a"
  12.                 for %%b in (h l) do if "!%%bm:-=!" equ "!%%bm!" set "%%bm= !%%bm!"
  13.                 set "_!a!=!str:~%%a,1!"&set ".!a!=!hm!:!lm!"            
  14.             )
  15.         )
  16.     )
  17. )
  18. for /l %%a in (1,1,40) do (
  19.     set "a=      !.%%a!"&set /a b=%%a%%8
  20.     for %%b in (!b!) do set "var=!var!!_%%a!!#%%b!"&set "var1=!var1!!a:~-6!!#%%b!"
  21. )
  22. echo %var%&echo %var1%
  23. pause>nul&goto :eof
  24. 我们去北大踢球吧
  25. 快上那儿等着信号
  26. 你不能离开大门口
  27. 生与死就在一瞬间
  28. 青春已从身边溜走
复制代码
***共同提高***

TOP

14楼的思路是比较巧妙,但美中不足就是set/p输出影响了效率。。。

下面给出一种乱序的方法(先替换a为#,再替换b为a,最后替换#为b从而达到a、b互换的效果):
  1. @echo off&setlocal enabledelayedexpansion
  2. set "#0=&echo,"
  3. for /f "skip=22" %%a in (%~0) do set "str=!str!%%a"
  4. for /l %%a in (0,1,39) do (
  5.     set /a a=!random!%%40
  6.     for %%b in (!a!) do (
  7.         set "a=!str:~%%b,1!"
  8.         for %%b in ("!str:~%%a,1!") do (
  9.             for %%c in (!a!) do (
  10.                 set "str=!str:%%c=#!"
  11.                 set "str=!str:%%~b=%%c!"
  12.                 set "str=!str:#=%%~b!"
  13.             )
  14.         )
  15.     )
  16. )
  17. for /l %%a in (0,1,39) do (
  18.     set /a "a=(%%a+1)%%8"
  19.     for %%b in (!a!) do set "var=!var!!str:~%%a,1!!#%%b!"
  20. )
  21. echo %var%
  22. pause>nul&goto :eof
  23. 我们去北大踢球吧
  24. 快上那儿等着信号
  25. 你不能离开大门口
  26. 生与死就在一瞬间
  27. 青春已从身边溜走
复制代码
 注:因为每次都是两个汉字互换位置(有时可能是自己换自己),所以偏移量的计算会要借助临时文件来实现。
***共同提高***

TOP

返回列表