Board logo

标题: 批处理 输出方框 [打印本页]

作者: plp626    时间: 2012-5-22 18:32     标题: 批处理 输出方框

本帖最后由 plp626 于 2012-5-22 18:36 编辑

网上找来的一个练习题, 有些人的代码走了弯路,发来看看大家的结果;
  1. -->test 1
  2. x
  3. -->test 2
  4. x x x
  5. x y x
  6. x x x
  7. -->test 3
  8. x x x x x
  9. x y y y x
  10. x y z y x
  11. x y y y x
  12. x x x x x
  13. -->test 4
  14. x x x x x x x
  15. x y y y y y x
  16. x y z z z y x
  17. x y z 1 z y x
  18. x y z z z y x
  19. x y y y y y x
  20. x x x x x x x
  21. -->test 5
  22. x x x x x x x x x
  23. x y y y y y y y x
  24. x y z z z z z y x
  25. x y z 0 0 0 z y x
  26. x y z 0 1 0 z y x
  27. x y z 0 0 0 z y x
  28. x y z z z z z y x
  29. x y y y y y y y x
  30. x x x x x x x x x
  31. -->test 6
  32. x x x x x x x x x x x
  33. x y y y y y y y y y x
  34. x y z z z z z z z y x
  35. x y z 0 0 0 0 0 z y x
  36. x y z 0 0 0 0 0 z y x
  37. x y z 0 0 1 0 0 z y x
  38. x y z 0 0 0 0 0 z y x
  39. x y z 0 0 0 0 0 z y x
  40. x y z z z z z z z y x
  41. x y y y y y y y y y x
  42. x x x x x x x x x x x
  43. -->test 7
  44. x x x x x x x x x x x x x
  45. x y y y y y y y y y y y x
  46. x y z z z z z z z z z y x
  47. x y z 0 0 0 0 0 0 0 z y x
  48. x y z 0 0 0 0 0 0 0 z y x
  49. x y z 0 0 0 0 0 0 0 z y x
  50. x y z 0 0 0 1 0 0 0 z y x
  51. x y z 0 0 0 0 0 0 0 z y x
  52. x y z 0 0 0 0 0 0 0 z y x
  53. x y z 0 0 0 0 0 0 0 z y x
  54. x y z z z z z z z z z y x
  55. x y y y y y y y y y y y x
  56. x x x x x x x x x x x x x
复制代码
规律就是如此(test后面的参数 小于100),请编写一个批处理程序,实现以上输出
作者: CrLf    时间: 2012-5-22 18:40

set /a 一族表示无压力
^_^
作者: plp626    时间: 2012-5-22 18:41

不准骄傲, 赛代码。。。
作者: neorobin    时间: 2012-5-22 21:03

本帖最后由 neorobin 于 2012-6-2 11:27 编辑

想到 3 种思路:
外扩, 内填, 拟出规则直接生成
其实是若干个同心 " 圆 ",  根据与 圆心 的距离, 可以很简单的确定 字符
作者: neorobin    时间: 2012-5-22 22:56

抢先发一个同心圆算法的
  1. @echo off & setlocal enabledelayedexpansion
  2. set "CS=zyx"
  3. for /l %%p in (1 1 99) do (
  4.   set /a "rMax=%%p-1"
  5.   for /l %%l in (-!rMax! 1 !rMax!) do (
  6.     set "L="
  7.     set /a "a=%%l, t=a>>31, a=(a+t)^t"
  8.     for /l %%c in (-!rMax! 1 !rMax!) do (
  9.       set /a "b=%%c, t=b>>31, b=(b+t)^t"
  10.       set /a "t=(a-b)>>31, r=(t&b)|(~t&a), rd=r-rMax-1"
  11.       if !r!==0 (
  12.         if !rMax! geq 3 (set "L=!L!1") else set "L=!L!!CS:~-%%p,1!"
  13.       ) else (
  14.         if !rd! lss -3 (
  15.           set "L=!L!0"
  16.         ) else for %%i in (!rd!) do set "L=!L!!CS:~%%i,1!"
  17.       )
  18.     )
  19.     echo,!L!
  20.   )
  21.   pause & cls
  22. )
复制代码

作者: neorobin    时间: 2012-5-23 00:30

本帖最后由 neorobin 于 2012-6-2 11:26 编辑

将 半径 大于或等于 4 时, 调整为 高效算法
  1. @echo off & setlocal enabledelayedexpansion
  2. if "%1"=="" (
  3.   for %%a in (  FontSize:00080008
  4.                 FontFamily:00000030
  5.                 WindowSize:00c700c7
  6.                 ScreenColors:0000000f
  7.                 CodePage:000001b5
  8.                 ScreenBufferSize:00c700c7
  9.   ) do for /f "tokens=1,2 delims=:" %%b in ("%%a") do (
  10.     >nul reg add HKCU\Console\CharBox /v %%b /t reg_dword /d 0x%%c /f
  11.   )
  12.   start "CharBox" /max "%ComSpec%" /c "%~f0" 1&goto:eof
  13. ) else ( >nul reg delete HKCU\Console\CharBox /f )
  14. set "CS=zyx" & set "CSR=xyz"
  15. for /l %%p in (1 1 200) do set "_0=0!_0!"
  16. set "_1=!_0:0=x!"
  17. set "_2=!_0:0=y!"
  18. set "_3=!_0:0=z!"
  19. set NL=^
  20. for /l %%p in (1 1 99) do (
  21.   title %%p
  22.   set /a "rMax=%%p-1"
  23.   if !rMax! lss 4 ( rem 同心圆算法, 效率太低, 故仅在半径小于 4 时处理
  24.     for /l %%l in (-!rMax! 1 !rMax!) do (
  25.       set "L="
  26.       set /a "a=%%l, t=a>>31, a=(a+t)^t"
  27.       for /l %%c in (-!rMax! 1 !rMax!) do (
  28.         set /a "b=%%c, t=b>>31, b=(b+t)^t"
  29.         set /a "t=(a-b)>>31, r=(t&b)|(~t&a), rd=r-rMax-1"
  30.         if !r!==0 (
  31.           if !rMax! geq 3 (set "L=!L!1") else set "L=!L!!CS:~-%%p,1!"
  32.         ) else (
  33.           if !rd! lss -3 (
  34.             set "L=!L!0"
  35.           ) else (
  36.             for %%i in (!rd!) do set "L=!L!!CS:~%%i,1!"
  37.           )
  38.         )
  39.       )
  40.       echo,!L!
  41.     )
  42.   ) else ( rem 在半径不小于 4 时, 切换为高效率算法
  43.     set "S3=" & set "E3="
  44.     for %%i in (1 2 3) do (
  45.       set /a "s=2*(rMax-%%i)+1"
  46.       for %%s in (!s!) do (
  47.         set "S3=!S3!!NL!!CSR:~0,%%i!!_%%i:~-%%s!!CS:~-%%i!"
  48.         set "E3=!CSR:~0,%%i!!_%%i:~-%%s!!CS:~-%%i!!NL!!E3!"
  49.       )
  50.     )
  51.     set /a "s=rMax-3"
  52.     for %%s in (!s!) do set "LC=xyz!_0:~-%%s!1!_0:~-%%s!zyx"
  53.     set "Ln=!LC:1=0!"
  54.     echo,!S3:~1!
  55.     for /l %%i in (1 1 !s!) do echo,!Ln!
  56.     echo,!LC!
  57.     for /l %%i in (1 1 !s!) do echo,!Ln!
  58.     echo,!E3:~0,-1!
  59.   )
  60.   pause & cls
  61. )
复制代码

作者: plp626    时间: 2012-6-8 16:53

我是用C写的
  1. ,#include <stdio.h>
  2. #define  ABS(X)  ((X)>=0 ? (X) : (-(X)))
  3. int main(int argc, char **argv)
  4. {
  5. argc != 2 ? printf("Usage: %s", "Missing!"),exit(1) : 0;
  6. int c,n=0;
  7. while(c=*argv[1]++)
  8. n = n * 10 + c - '0';
  9. int i, j, ii, jj, map[100]={'x','y','z'};
  10. for (i=3; i<n-1; i++)
  11. map[i]='0';
  12. n>3 ? map[n-1]='1': 0;
  13. for (i=0; i<2*n-1; i++){
  14. for (j=0; j<2*n-1; j++){
  15. ii = ABS(n-i-1),jj = ABS(n-j-1);
  16. printf("%c ",map[n-1-(ii>jj ? ii:jj)]);
  17. }
  18. printf("\n");
  19. }
  20. return 0;
  21. }
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2