Board logo

标题: 在控制台打印金字塔 [打印本页]

作者: happy886rr    时间: 2017-3-16 21:28     标题: 在控制台打印金字塔

题目要求:
    用字符*打印一个金字塔,不限语言。

效果:


实现:
  1. @echo off
  2. set "str=                                           ******************************************"
  3. for /l %%i in (1,1,38) do (
  4. call,echo,%%str:~%%i,%%i%%
  5. )
  6. set/p=
复制代码
欢迎帖码,语言不限。
作者: taofan712    时间: 2017-3-16 21:57

我要来答,给我3分钟。
作者: codegay    时间: 2017-3-16 22:03

  1. >>> print(''.join([('*'*r).center(17,'-')+"\n" for r in range(1,18,2)]))
  2. --------*--------
  3. -------***-------
  4. ------*****------
  5. -----*******-----
  6. ----*********----
  7. ---***********---
  8. --*************--
  9. -***************-
  10. *****************
复制代码

作者: pcl_test    时间: 2017-3-16 22:08

ps
  1. $n=9;1..$n|%{' '*($n-$_)+'*'*(2*$_-1)}
复制代码

作者: taofan712    时间: 2017-3-16 22:23

  1. @echo off & setlocal EnableDelayedExpansion
  2. set max=78
  3. for /l %%$ in (1 1 10) do (
  4.     set a=!a!**
  5.     call :zhong !a!
  6. )
  7. pause
  8. :zhong
  9. set s=%1
  10. for /l %%# in (1,2,!max!) do if "!s:~%max%,1!" == "" set "s= !s! "
  11. set s=!s:~1,%max%!& echo;!s!
  12. exit /b
复制代码

作者: bbaa    时间: 2017-3-16 22:24

仅支持中文效率极低:http://www.bathome.net/thread-43049-1-1.html
作者: codegay    时间: 2017-3-16 23:32

这个贴应该发到出题区。
作者: 老刘1号    时间: 2017-3-16 23:34

本帖最后由 老刘1号 于 2017-3-18 18:25 编辑

受win7CMD特性限制,只支持XP系统。
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. ::CODER BY Old.Liu POWERD BY iBAT
  4. set /p long=Input:
  5. set /a long=long/2
  6. set /a long=long*2+1
  7. set /a half=long/2
  8. set /a i=1
  9. for /l %%a in (1 1 !half!) do set/p= <nul
  10. for /l %%a in (1 1 !i!) do set/p=*<nul
  11. echo.
  12. if !long! == 1 goto end
  13. :loop
  14. set /a i+=2
  15. set /a half-=1
  16. for /l %%a in (1 1 !half!) do set/p= <nul
  17. for /l %%a in (1 1 !i!) do set/p=*<nul
  18. echo.
  19. if "!i!" equ "!long!" goto end
  20. goto loop
  21. :end
  22. pause
复制代码

作者: happy886rr    时间: 2017-3-17 00:03

回复 7# codegay

出题区权限不够,挑战区这题又太简单。
作者: taofan712    时间: 2017-3-17 00:15

回复 9# happy886rr

继续搞点这种题目啊,趣味性十足。
作者: taofan712    时间: 2017-3-17 09:21

被截图蒙蔽了,实际上并没有居中的要求?
那么可以减几行
  1. @echo off&setlocal enabledelayedexpansion
  2. set "kong="
  3. for /l %%a in (1,1,17) do set "kong=!kong! "
  4. set "s=*"
  5. for /l %%a in (1,1,17) do (
  6.    echo !kong!!s!
  7.    set "kong=!kong:~1!"
  8.    set "s=!s!**!
  9. )
  10. pause
复制代码

作者: taofan712    时间: 2017-3-17 09:29

嗯嗯,还可以再少几行
  1. @set s=                 *
  2. :r
  3. @echo;%s%&if "%s:~0,1%"==" " set s=%s:~1%%s:~-1%%s:~-1%&goto :r
  4. @pause
复制代码

作者: taofan712    时间: 2017-3-17 09:39

这样判断的话,又可以再少几个字
  1. @set s=                 *
  2. :r
  3. @echo(%s%&if %s:~,1%*==* set s=%s:~1%**&goto:r
  4. @pause
复制代码

作者: 523066680    时间: 2017-3-17 10:09


作者: taofan712    时间: 2017-3-17 10:14

用goto取代if,又能减少几个字节。
  1. @set s=                 O
  2. :O
  3. @echo;%s%&set s=%s:~1%OO&goto%s:~,2%O
  4. :OO
  5. pause
复制代码

作者: happy886rr    时间: 2017-3-17 11:00

回复 15# taofan712
感觉你已经做到极限了。
作者: taofan712    时间: 2017-3-17 11:36

本帖最后由 taofan712 于 2017-3-17 11:43 编辑

回复 16# happy886rr

不,还没有,我从你这道题收获颇丰啊!
我后来有思考过,goto其实还可以减少一个标签,而且如果为了减少字节数,我从你用“set/p=”代替常见的pause,想到不如用ftp或者more,毕竟又少了两三个字符。
这样,九层,最终66个字节吧。
作者: 523066680    时间: 2017-3-17 17:55

接下来可以打印字符版 Sirpinsiki 三角形
作者: happy886rr    时间: 2017-3-17 21:59

回复 18# 523066680
那个Sirpinsiki太难了,我估计只有你跟aa77dd@163.com 兄能实现。
作者: 523066680    时间: 2017-3-17 22:43

本帖最后由 523066680 于 2017-3-18 08:26 编辑

回复 19# happy886rr

夸张了 ,没试过字符版,好像可以先从直角开始。
  1. my $floor = 5;
  2. my $s = " "x$floor;
  3. my @line;
  4. for my $n ( 0 .. $floor-1 )
  5. {
  6.     $s=~s/ /*/;
  7.     $line[$n] = $s;
  8. }
  9. for my $n ( $floor .. $floor*$floor - 1 )
  10. {
  11.     $line[$n] = $line[$n%$floor] x ($n/$floor+1);
  12. }
  13. print join("\n", @line);
复制代码

*   
**   
***  
****
*****
*    *   
**   **   
***  ***  
**** ****
**********
*    *    *   
**   **   **   
***  ***  ***  
**** **** ****
***************
*    *    *    *   
**   **   **   **   
***  ***  ***  ***  
**** **** **** ****
********************
*    *    *    *    *   
**   **   **   **   **   
***  ***  ***  ***  ***  
**** **** **** **** ****
*************************



发现差远了,晚点儿补上
作者: 老刘1号    时间: 2017-3-17 23:05

本帖最后由 老刘1号 于 2017-3-17 23:48 编辑

回复 1# happy886rr
兼容WIN7的来了
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. ::CODER BY Old.Liu POWERD BY iBAT
  4. set /p long=Input:
  5. set /a long=long/2
  6. set /a long=long*2+1
  7. set /a half=long/2
  8. set /a i=1
  9. set a=.
  10. for /l %%a in (1 1 !half!) do set "a=!a! "
  11. for /l %%a in (1 1 !i!) do set a=!a!*
  12. echo!a!
  13. if !long! == 1 goto end
  14. :loop
  15. set /a i+=2
  16. set /a half-=1
  17. set a=.
  18. for /l %%a in (1 1 !half!) do set "a=!a! "
  19. for /l %%a in (1 1 !i!) do set a=!a!*
  20. echo!a!
  21. if "!i!" equ "!long!" goto end
  22. goto loop
  23. :end
  24. pause
复制代码

作者: happy886rr    时间: 2017-3-17 23:14

本帖最后由 happy886rr 于 2017-3-17 23:51 编辑

回复 21# 老刘1号
最后一版正常。
作者: 老刘1号    时间: 2017-3-17 23:21

本帖最后由 老刘1号 于 2017-3-18 00:07 编辑

回复 22# happy886rr


    好的,收到
不用set输出的话……这种题不准备用批写了,太费劲
作者: 老刘1号    时间: 2017-3-17 23:26

回复 17# taofan712


    现在这个时代,代码不仅是给机器看的,其他人也需要看,也需要理解,这样才能一起做成大的项目
过度的精简代码失去的东西比得到的多的多。
这也是为何会有注释,有缩进
编程的最高境界就是能让你写的程序自成文章
作者: 523066680    时间: 2017-3-18 09:37

本帖最后由 523066680 于 2017-3-18 09:56 编辑
  1. my @lines = "*";
  2. func( \@lines, 1 );
  3. sub func
  4. {
  5.     my ($ref, $lv) = (shift, shift);
  6.     my @tri;
  7.     my $top = $#$ref + 1;
  8.     grep { push @tri, "$_ $_" } @$ref;
  9.     grep { unshift @tri, " "x$top .$_ ." "x$top } ( reverse @$ref );
  10.     ( $lv <= 3 ) ?
  11.          func( \@tri, $lv+1 ) : print join("\n", @tri);
  12. }
复制代码
  1.                *               
  2.               * *              
  3.              *   *            
  4.             * * * *            
  5.            *       *           
  6.           * *     * *         
  7.          *   *   *   *         
  8.         * * * * * * * *        
  9.        *               *      
  10.       * *             * *      
  11.      *   *           *   *     
  12.     * * * *         * * * *   
  13.    *       *       *       *   
  14.   * *     * *     * *     * *  
  15. *   *   *   *   *   *   *   *
  16. * * * * * * * * * * * * * * * *
复制代码

作者: codegay    时间: 2017-3-18 10:40

Writing Code That Nobody Else Can Read.
作者: pcl_test    时间: 2017-3-18 11:47

  1. @echo off&setlocal enabledelayedexpansion
  2. set level=4
  3. set /a n=100000000,m=1
  4. for /l %%a in (1 1 %level%) do set /a m*=2
  5. set /a a=n+2*m,aa=m-1+n,m=n+m
  6. for /l %%a in (%n% 1 %a%) do set "#%%a= "
  7. set #%m%=*
  8. for /l %%a in (%n% 1 %aa%) do (
  9.     set "s="&set r=*
  10.     for /f "tokens=1* delims==" %%b in ('set #') do set "s=!s!%%c"
  11.     echo;!s!
  12.     set /a b=m-%%a+n,c=m+%%a-n
  13.     for /l %%c in (!b! 1 !c!) do (
  14.         set /a d=%%c-1,e=%%c+1,h=c+1
  15.         for %%i in (!d!) do set f=!#%%i!
  16.         for %%j in (!e!) do set g=!#%%j!
  17.         if "!f!" neq "!g!" (set t=*) else set "t= "
  18.         for %%i in (!d!) do set #%%i=!r!
  19.         set r=!t!
  20.     )
  21.     set #!c!=!t!&set #!h!=*
  22. )
  23. pause
复制代码

作者: 老刘1号    时间: 2017-3-18 14:21

回复 20# 523066680
  1. '&@(cls&Echo off 2>nul 3>nul)
  2. '&set /p long=输入长度:
  3. '&set /p floor=输入层数:
  4. '&Cscript -nologo -e:vbscript "%~0" "%floor%" "%Long%"
  5. '&Pause&Exit
  6. floor_=WScript.Arguments(0)
  7. long_=WScript.Arguments(1)
  8. For a = 1 To floor_
  9. For i = 1 To long_
  10. For b = 1 To a
  11. For j = 1 To i
  12. Echo=Echo&"*"
  13. Next
  14. For j = i To long_
  15. Echo=Echo&" "
  16. Next
  17. Next
  18. Echo=Echo&vbNewLine
  19. Next
  20. Next
  21. WScript.Echo echo
复制代码

作者: 523066680    时间: 2017-3-18 14:26

本帖最后由 523066680 于 2017-3-18 14:29 编辑

回复 28# 老刘1号


    其实我20楼的那个不是标准的,上午想起来不对马上打草稿补了一发~

原版的是有一种递归性质,不管从哪一部分放大看都有相似性,而且越大越密集越好看

https://en.wikipedia.org/wiki/Sierpinski_triangle
作者: 老刘1号    时间: 2017-3-18 18:16

回复 29# 523066680


    酱紫啊……
作者: happy886rr    时间: 2017-3-18 18:41

本帖最后由 happy886rr 于 2017-3-18 18:51 编辑

回复 30# 老刘1号
你画的是有点偏差了,应该这样画(外链图,随时失效)
  1. @echo off
  2. mode con cols=300 lines=80
  3. setlocal enabledelayedexpansion
  4. set "Space=                                                                                                    "
  5. set/a "L=(1<<7)-1"
  6. for /l %%i in (0,1,!L!) do (
  7. set/a "1/(%%i&1)" 2>NUL || (
  8. set/a "SL=(L-%%i)>>1"
  9. for %%j in (!SL!) do (
  10. set "PreSpace=!Space:~0,%%j!"
  11. )
  12. for /l %%j in (0,1,!L!) do (
  13. set/a "1/((%%i&%%j)-%%j)" 2>NUL && (
  14. set "PreSpace=!PreSpace! "
  15. ) || (
  16. set "PreSpace=!PreSpace!*"
  17. )
  18. )
  19. echo;!PreSpace!
  20. )
  21. )
  22. set/p=LEVEL: 7
复制代码

作者: happy886rr    时间: 2017-3-18 18:43

回复 29# 523066680
Matrix67的方法就是好用。
作者: a20150604    时间: 2017-3-19 00:59

  1. @echo off & setlocal enabledelayedexpansion
  2. set /a "w=80,h=35,t=w*h,xc=w/2,yc=h/2"
  3. mode %w%,40
  4. for /l %%i in (1 1 !t!) do set "s=!s! "
  5. call :f 0 -16 32 s
  6. echo;!s! &pause &exit
  7. :f xtop ytop hei s
  8. REM 半顶角对边与底角对边比: 1:1 , hei <= 1, 绘 3 点, 否则递归
  9. setlocal
  10. set "s=!%4!"
  11. if %3 leq 1 (
  12.     set /a "a=%1 - 1, d=b=%2 + 1, c= %1 + 1"
  13.     call :d %1 %2 & call :d !a! !b! & call :d !c! !d!
  14. ) else (
  15.     set /a "h=%3 >> 1, a= %1 - h, d=b=%2 + h, c= %1 + h"
  16.     call :f %1 %2 !h! %4 & call :f !a! !b! !h! %4 & call :f !c! !d! !h! %4
  17. )
  18. (
  19. endlocal
  20. set "%4=%s%"
  21. exit /b
  22. )
  23. :d
  24. set /a "i=%1-xc + (%2-yc) * w + 1, L=i-1"
  25. for /f "tokens=1,2" %%a in ("!L! !i!") do (set s=!s:~0,%%a!*!s:~%%b!)
  26. exit /b
复制代码





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