[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
将我19楼的代码简化并提效如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (0,1,9) do (
  3.     for /f "delims=" %%b in (b.txt) do (
  4.          for %%c in (%%b) do (
  5.               set /a num=%%c-%%a,num=num%%10
  6.               if !num! equ 0 (
  7.                  set "str=000%%c"&set "str=%%a!str:~-3!"
  8.                  if defined _!str! (
  9.                    call,set "_!str!=%%_!str!%% %%c"
  10.                    ) else (
  11.                    set "_!str!=%%c"
  12.                  )
  13.                )        
  14.           )
  15.      )
  16. )
  17. for /f "tokens=1,2 delims==_" %%a in ('set _') do (
  18.      set "str=%%a"&set "str=!str:~,1!"
  19.      if not defined !str! (
  20.        echo.&set /p=!str! %%b <nul&set "!str!=a"
  21.        ) else (
  22.        set /p=%%b <nul
  23.      )
  24. )
  25. pause>nul
复制代码
1

评分人数

    • rat: 够简洁,但效率……PB + 30
***共同提高***

TOP

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. md l100
  4. md g100
  5. for /l %%i in (0,1,9) do set "n%%i=%%i"
  6. for /f "delims=" %%a in (1.txt) do (
  7. for %%b in (%%a) do (
  8. if %%b lss 100 (echo off >l100/%%b) else (echo off >g100/%%b)
  9. )
  10. )
  11. dir /o:n /b l100 >>result.txt
  12. dir /o:n /b g100 >>result.txt
  13. for /f %%m in (result.txt) do (
  14. set num=%%m
  15. set re=n!num:~-1!
  16. call set "!re!=%%!re!%% %%m"
  17. )
  18. for /l %%p in (0,1,9) do call echo %%n%%p%%
  19. rd /s /q l100
  20. rd /s /q g100
  21. del result.txt
  22. pause
  23. goto :eof
复制代码
昨天没看到有排序的要求  HOHO  现在写好了   新手   给点鼓励

TOP

原帖由 terse 于 2009-4-14 10:12 发表

虽然少个FOR 但CALL的效率不知道怎么样
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
   for %%j in (%%i) do (
       set str=%%j
       call set _!str:~-1!=%%_!st ...

怎么不加上排序?
***共同提高***

TOP

回复 23楼 的帖子

call 的效率比 for 差。(命令耗时清单)

以下是用 timeit.exe 测出的结果:
Average for terse.bat key over 5 runs

Version Number:   Windows NT 5.1 (Build 2600)
Exit Time:        10:32 am, Tuesday, April 14 2009
Elapsed Time:     0:00:00.056
Process Time:     0:00:00.062

System Calls:     5282
Context Switches: 327
Page Faults:      586
Bytes Read:       17129
Bytes Written:    0
Bytes Other:      72752


Average for terse_call.bat key over 5 runs

Version Number:   Windows NT 5.1 (Build 2600)
Exit Time:        10:32 am, Tuesday, April 14 2009
Elapsed Time:     0:00:00.143
Process Time:     0:00:00.156

System Calls:     4479
Context Switches: 658
Page Faults:      688
Bytes Read:       23031
Bytes Written:    6220
Bytes Other:      78810

[ 本帖最后由 tireless 于 2009-4-14 10:32 编辑 ]

TOP

原帖由 terse 于 2009-4-13 17:10 发表
先抛砖 感觉可以少个FOR

虽然少个FOR 但CALL的效率不知道怎么样
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.    for %%j in (%%i) do (
  4.        set str=%%j
  5.        call set _!str:~-1!=%%_!str:~-1!%% %%j
  6. ))
  7. for /l %%a in (0,1,9) do if not "!_%%a!"=="" echo %%a!_%%a!
  8. pause
复制代码
1

评分人数

TOP

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /l %%i in (0,1,9) do set "n%%i=%%i"
  4. for /f "delims=" %%a in (1.txt) do (
  5. for %%b in (%%a) do (
  6. set num=%%b
  7. set re=n!num:~-1!
  8. call set "!re!=%%!re!%% %%b"
  9. )
  10. )
  11. for /l %%p in (0,1,9) do call echo %%n%%p%%
  12. pause
  13. goto :eof
复制代码
好了  今天来给我昨天那个稍微改了下  可以了  HOHO
1

评分人数

TOP

原帖由 terse 于 2009-4-13 17:10 发表
先抛砖 感觉可以少个FOR@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
   for %%j in (%%i) do (
       set str=%%j
       for /l %%a in (0,1,9) do (
       if "!str: ...



set真是用的经典,学习了。

TOP

感觉还可以优化,两个大循环可以合并,要开会了,占下位子先。。。
***共同提高***

TOP

向各献丑了,变量赋值法:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (0,1,9) do (
  3.     for /f "delims=" %%b in (b.txt) do (
  4.          for %%c in (%%b) do (
  5.               set /a num=%%c-%%a,num=num%%10
  6.               if !num! equ 0 set "_%%a=!_%%a! %%c"
  7.          )
  8.     )
  9. )
  10. for /f "tokens=1,2 delims==_" %%a in ('set _') do (
  11.      set /p=%%a <nul&setlocal enabledelayedexpansion
  12.      for %%c in (%%b) do (
  13.           set "str=000%%c"&set "str=!str:~-3!"
  14.             if defined #!str! (
  15.             call,set "#!str!=%%#!str!%% %%c"
  16.             ) else (
  17.             set "#!str!=%%c"  
  18.         )
  19.      )
  20.      for /f "tokens=2 delims==" %%d in ('set #') do set /p=%%d <nul
  21.      echo.&endlocal
  22. )  
  23. pause>nul
复制代码
2

评分人数

    • tyc: 利用set ,有点投机取巧的PB + 2
    • rat: 够简洁,但效率……PB + 30
***共同提高***

TOP

这个题目已经不是新手题了啊。
各位版主也出出手吧,是否应该考虑把terse兄的帖子也打开呢
batman 版主也把自己的代码晒晒吧。
11 楼 tireless 的代码产生了临时文件、效率还行、但不能处理重复数字。
12 楼 gohai 的代码同上。
rat 版主的代码是否能提高下效率。

[ 本帖最后由 随风 于 2009-4-14 04:24 编辑 ]
技术问题请到论坛发帖求助!

TOP

js有个sort方法

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.   for %%b in (%%a) do (
  4.     call :p %%b
  5.   )
  6. )
  7. for /l %%i in (0,1,9) do (
  8.   if defined f%%i (
  9.     call :sortstr str%%i newstr
  10.     echo !newstr!
  11.   )
  12. )
  13. pause
  14. goto :eof
  15. :p
  16. set s=%1
  17. for /l %%i in (0,1,9) do (
  18.   if "!s:~-1!"=="%%i" (
  19.     if not defined f%%i2 set f%%i2=1&set str%%i=%%i
  20.     set str%%i=!str%%i! %%b
  21.     if not defined f%%i set f%%i=1
  22.     goto :eof
  23.   )
  24. )
  25. goto :eof
  26. :sortstr
  27. setlocal
  28. for %%a in (!%1!) do (
  29. set/ajj+=1
  30. set s!jj!=%%a
  31. )
  32. call :sort s %jj%
  33. for /l %%a in (1,1,%jj%) do (
  34. set ss=!ss! !s%%a!
  35. )
  36. endlocal&set %2=%ss%&goto :eof
  37. :sort arrname %ubound%
  38. set a=%1&set u=%2&set i=2
  39. :sort_1
  40. if %i% gtr %u% goto :eof
  41. set /a %a%0=%a%%i%,j=i-1
  42. :sort_2
  43. if !%a%0! lss !%a%%j%! (
  44. set /a k=j+1
  45. set /a %a%!k!=%a%%j%,j-=1
  46. goto sort_2
  47. )
  48. set /a k=j+1
  49. set /a %a%%k%=%a%0,i+=1
  50. goto sort_1
复制代码
1

评分人数

    • batman: 简洁和效率上欠妥PB + 3

TOP

下面是我做的, 分类 + 排序,
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. del b.txt&del 1.txt&del 2.txt
  4. for /f "usebackq delims=" %%i in (`more a.txt`) do (
  5.   for %%j in (%%i)do (
  6.     set "number=   %%j"
  7.     echo !number:~-4!>>1.txt
  8.   )
  9. )
  10. for /f "usebackq" %%i in (`sort 1.txt`) do (
  11.   echo %%i>>2.txt
  12. )
  13. del 1.txt
  14. for /l %%i in (0,1,9) do (
  15. set /a input=0
  16. for /f "delims=" %%j in (2.txt) do (
  17. set /a num=%%j
  18. set /a flag=!num:~-1,1!
  19. if !flag! equ %%i (
  20. if !input! equ 0 (
  21. set /p=!flag! <nul>>b.txt
  22. )
  23. set /a input=1
  24. set /p=!num! <nul >>b.txt
  25. )
  26. )
  27. if !input! equ 1 (
  28. echo. >>b.txt
  29. )
  30. )
  31. start b.txt
  32. del 1.txt&del 2.txt
  33. exit
复制代码
1

评分人数

    • batman: 代码可大幅优化PB + 3

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=*" %%a in (a.txt) do (
  3.   for %%i in (%%a) do set "var=00%%i" & echo !var:~-3!
  4. ))>a_tmp.txt
  5. for /f "tokens=* delims=0" %%a in ('sort a_tmp.txt') do (
  6.   set var=%%a
  7.   for %%i in (#!var:~-1!) do set %%i=!%%i! %%a
  8. )
  9. for /l %%a in (0 1 9) do if defined #%%a echo %%a!#%%a!
  10. del a_tmp.txt & pause
复制代码

[ 本帖最后由 tireless 于 2009-4-14 11:50 编辑 ]

TOP

回复 9楼 的帖子

楼主出这个题目,意图应该不仅仅是考察截取最后一位字符的方法,你可以先尝试一下其它思路,比如:取余。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表