[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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个。
补充:
  两步可写在一个批内,也可分步写成两个批。
----------------------------------------------
由于本人的失误原始文本中出现了两个边字,现已经改正(其中一个改为了儿字)。。。
***共同提高***

个人感觉这个题目可能解法相对比较单一,并没有太多“百花齐放”的余地

TOP

感觉batman的练习题难度越来越高
可能并不适合给新手练习
倒是可以给老鸟们活活脑子

如果不用临时文件
对自身文本进行操作
可选的方法并不多
偏移量定位及乱序排列
可能会有思路的不同
天的白色影子

TOP

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

TOP

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

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

评分人数

TOP

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

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

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

3、pause都忘记写了。

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

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

TOP

已知行数和字符数 是否可以再简化点 个人感觉 乱序排列的SET效率并不很理想
两个边字的问题 可以放入的吧 因乱序后还是可以对应的哦

TOP

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

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

TOP

已知的  我直接40个  ECHO

TOP

特殊情况有特殊解法:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "skip=11 useback" %%a in ("%~0") do set str=!str!%%a
  3. for /l %%a in (40 -1 1) do (
  4. set /a ra=!random!%%%%a,m=~-%%a%%8
  5. for %%b in (!ra!) do (
  6. set /p=!str:~%%b,1!<nul
  7. for %%c in (!str:~%%b,1!) do set str=!str:%%c=!
  8. )
  9. if !m!==0 echo;
  10. )
  11. pause>nul&exit
  12. 我们去北大踢球吧
  13. 快上那儿等着信号
  14. 你不能离开大门口
  15. 生与死就在一瞬间
  16. 青春已从身边溜走
复制代码

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

本帖最后由 zm900612 于 2011-4-23 22:24 编辑
10# zm900612
下面是阁下代码的一次运行结果:
就死门离们上吧间
死生就着们踢离大
开我不离儿去去儿
快等北快北我去快
我大大们去们们我
batman 发表于 2011-4-21 18:59

当时只是为了表达思路,几分钟搞出来也没测试就回了,所以没发现这个问题...出错原因是漏了"",而且后来发现给定的文字中有重字,所以不能用变量替换取巧。
原帖就不改了,发一下新代码,这回是调试过无误的:
  1. @echo off&setlocal enabledelayedexpansion&echo %time%
  2. for /f "skip=14 useback" %%a in ("%~0") do set str=!str!%%a
  3. for /l %%a in (1 1 39) do set .!str:~%%a,1!=%%a
  4. for /l %%a in (40 -1 1) do (
  5. set /a "ra=!random!%%%%a","m=~-%%a%%8",n=ra+1
  6. for %%b in ("str:~!ra!,1") do (
  7. set /a "p=(40-%%a)-.!%%~b!","x=(40-%%a)%%8-.!%%~b!%%8","y=(40-%%a)/8-.!%%~b!/8"
  8. set "echo=!echo!!%%~b!"&set "xy=!xy!   !x!: !y!   "
  9. for /f "tokens=1* delims=@" %%c in ("!ra!@!n!") do set str=!str:~0,%%~c!!str:~%%~d!
  10. )
  11. )
  12. for /l %%a in (0 8 32) do echo !echo:~%%a,8!
  13. echo %xy: -=-%
  14. echo %time%&pause>nul&exit
  15. 我们去北大踢球吧
  16. 快上那儿等着信号
  17. 你不能离开大门口
  18. 生与死就在一瞬间
  19. 青春已从身边溜走
复制代码
优化了一下,用时减少一半
1

评分人数

    • batman: 好!思路绝了!PB + 20

TOP

其实我本意只是想提出一个随机取值的思路,因为常规思路要定义大量变量,很容易影响P的整体性能,不过话说回来,估计那个办法大概早有人发明了吧...

TOP

返回列表