返回列表 发帖

【练习-022】批处理对特殊字符的输出挑战

出题目的:
       1 解决新手们对特殊字符的恐慌问题,增强大家信心
       2 掌握开启变量延迟的时机(技巧)
       3 重温随机取值
加分原则:
       1 思路新颖基分5分
       2 代码高效基分4分
       3 代码简洁基分3分
       4 代码通用基分2分
       5 无临时文件基分1分
       6 完美代码加15分
题目如下:
       要求通过批处理输出10行每行30个由特殊字符随机组成的字符串(见举例)
\<^=|>*)(~$=!$==###"^!!&#*^~')
"^:*\*)>^&:@<%:"^>^'|(^~!)&&|&
%)'(^)$!|~'!%||##(%*):$(!>)%:&
^!"'@\\~$>$*@~:'=='(=)|(^=|&%|
%)'&*'&&&>@^~"*^*||>$~|<!'<%=&
(|"\~**'^@^|))#@%$|^%)|#&**%<"
~)|\!(%:\#%>>#$&<&~!)@~~~=>!'*
|*'&<<$$!\%**:$*'=\"!$&|)#(*|~
#=\@@)<\=!%'(~\)":#<&%"'*!^>&~
:^@^^*>!\~%$%$=\=$>|%$~@"\~&#*COPY
[ 本帖最后由 batman 于 2008-9-7 09:49 编辑 ]
***共同提高***

先来抛砖,没啥新意。
:?^~!#$%^&*()='"><|/@\
@echo off
set/p str=<%~fs0
setlocal enabledelayedexpansion
for /l %%a in (1 1 10) do (
     for /l %%i in (1 1 30) do (
          set/a n=!random!%%22
          call :lp
     )
     echo !var!&set "var="
)
pause>nul&exit/b
:lp
set "var=!var!!str:~%n%,1!"COPY

[ 本帖最后由 pusofalse 于 2008-9-7 18:18 编辑 ]
3

评分人数

心绪平和,眼藏静谧。

TOP

提示:对特殊字符输出有一个关键的步骤,那就是转义,将特殊字符转义。
***共同提高***

TOP

越搞越糊涂了....

还是回去想想,占个位子...

TOP

有个小问题,不用call直接把
set "var=!var!!str:~%n%,1!"
这一句加在随机数的后面怎么不行?把%n%也替换成了!n!,但是出来的是一片片特殊字符,根本没按代码写的按三十个输出。
只有说出来被人嘲笑的才是理想。

TOP

5# superbat
你这样就试
:~!@#$%^&*()<>"/\|'=;
@echo off
set/p str=<%~fs0 >nul
setlocal enabledelayedexpansion
for /l %%a in (1 1 10) do (
     set "var="
     for /l %%b in (1 1 30) do (
        set/an=!random!%%21
        for %%c in (!n!) do set "var=!var!!str:~%%c,1!"
     )
     echo !var!
)
pauseCOPY

TOP

不错
爱好 就是快死也要鼓捣的东西

TOP

感觉batman出的题目都太难了,用作挑战题才恰当。

TOP

sed -n p test.txtCOPY

TOP

回复 9# Seder


test.txt是不存在的
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 10# Batcher


    看错题了

TOP

命令提示符下运行:
gawk "BEGIN{srand();for(i=0;i<10;i++){for(j=0;j<30;j++){aryRand[0]=int(15*rand()+33);aryRand[1]=int(5*rand()+58);aryRand[2]=int(4*rand()+91);aryRand[3]=int(4*rand()+123);printf(\"%c\",aryRand[int(4*rand())]);}print \"\";}}"COPY

若保存为bat,则保存这个:
gawk "BEGIN{srand();for(i=0;i<10;i++){for(j=0;j<30;j++){aryRand[0]=int(15*rand()+33);aryRand[1]=int(5*rand()+58);aryRand[2]=int(4*rand()+91);aryRand[3]=int(4*rand()+123);printf(\"%%c\",aryRand[int(4*rand())]);}print \"\";}}"COPY

TOP

@echo off
set "$=!#$%%&'()*+,-./:;<=>?@[\]^_`{|}~""
setlocal enabledelayedexpansion
(for /l %%i in (1, 1, 10) do (
    set "_="
    for /l %%j in (1, 1, 30) do (
        set /a n = !random! %% 32
        for /l %%k in (!n!, 1, !n!) do (
            set "_=!_!!$:~%%k,1!"
        )
        
    )
    echo !_!
)) > 1.txt
pauseCOPY
1

评分人数

    • batman: 兄弟也有心做这样的题,难能可贵PB + 15

TOP

set "dm=:?^~!#$%^&*()='"><|/@\"
@echo off
setlocal enabledelayedexpansion
for /l %%a in (0 1 9) do (
     set text=<nul
     for /l %%i in (1 1 30) do (
          set/a zifu=!random!%%22
          call set zifu=^%%dm:~!zifu!,1%%
          set text=!text!!zifu!
     )
     echo;!text!
)

TOP

原来我当时没有贴出自己的代码,现在补写一个:
@echo off
set "str=:~!@#$%%&*()_-+={[]}|\:;'<,.>?/^^""
setlocal enabledelayedexpansion
for /l %%a in (1,1,10) do (
  for /l %%b in (1,1,30) do (
    set /a a=!random!%%33
    for %%c in (!a!) do set "var=!var!!str:~%%c,1!"
  )
  echo !var!&set "var="
)  
pause>nulCOPY
***共同提高***

TOP

返回列表