返回列表 发帖

在控制台打印金字塔

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

效果:


实现:
@echo off
set "str=                                           ******************************************"
for /l %%i in (1,1,38) do (
call,echo,%%str:~%%i,%%i%%
)
set/p=COPY
欢迎帖码,语言不限。

@echo off & setlocal enabledelayedexpansion
set /a "w=80,h=35,t=w*h,xc=w/2,yc=h/2"
mode %w%,40
for /l %%i in (1 1 !t!) do set "s=!s! "
call :f 0 -16 32 s
echo;!s! &pause &exit
:f xtop ytop hei s
REM 半顶角对边与底角对边比: 1:1 , hei <= 1, 绘 3 点, 否则递归
setlocal
set "s=!%4!"
if %3 leq 1 (
    set /a "a=%1 - 1, d=b=%2 + 1, c= %1 + 1"
    call :d %1 %2 & call :d !a! !b! & call :d !c! !d!
) else (
    set /a "h=%3 >> 1, a= %1 - h, d=b=%2 + h, c= %1 + h"
    call :f %1 %2 !h! %4 & call :f !a! !b! !h! %4 & call :f !c! !d! !h! %4
)
(
endlocal
set "%4=%s%"
exit /b
)
:d
set /a "i=%1-xc + (%2-yc) * w + 1, L=i-1"
for /f "tokens=1,2" %%a in ("!L! !i!") do (set s=!s:~0,%%a!*!s:~%%b!)
exit /bCOPY
1

评分人数

TOP

回复 29# 523066680
Matrix67的方法就是好用。

TOP

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

回复 30# 老刘1号
你画的是有点偏差了,应该这样画(外链图,随时失效)
@echo off
mode con cols=300 lines=80
setlocal enabledelayedexpansion
set "Space=                                                                                                    "
set/a "L=(1<<7)-1"
for /l %%i in (0,1,!L!) do (
set/a "1/(%%i&1)" 2>NUL || (
set/a "SL=(L-%%i)>>1"
for %%j in (!SL!) do (
set "PreSpace=!Space:~0,%%j!"
)
for /l %%j in (0,1,!L!) do (
set/a "1/((%%i&%%j)-%%j)" 2>NUL && (
set "PreSpace=!PreSpace! "
) || (
set "PreSpace=!PreSpace!*"
)
)
echo;!PreSpace!
)
)
set/p=LEVEL: 7COPY
2

评分人数

TOP

回复 29# 523066680


    酱紫啊……

TOP

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

回复 28# 老刘1号


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

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

https://en.wikipedia.org/wiki/Sierpinski_triangle
[url=][/url]

TOP

回复 20# 523066680
'&@(cls&Echo off 2>nul 3>nul)
'&set /p long=输入长度:
'&set /p floor=输入层数:
'&Cscript -nologo -e:vbscript "%~0" "%floor%" "%Long%"
'&Pause&Exit
floor_=WScript.Arguments(0)
long_=WScript.Arguments(1)
For a = 1 To floor_
For i = 1 To long_
For b = 1 To a
For j = 1 To i
Echo=Echo&"*"
Next
For j = i To long_
Echo=Echo&" "
Next
Next
Echo=Echo&vbNewLine
Next
Next
WScript.Echo echoCOPY

TOP

@echo off&setlocal enabledelayedexpansion
set level=4
set /a n=100000000,m=1
for /l %%a in (1 1 %level%) do set /a m*=2
set /a a=n+2*m,aa=m-1+n,m=n+m
for /l %%a in (%n% 1 %a%) do set "#%%a= "
set #%m%=*
for /l %%a in (%n% 1 %aa%) do (
    set "s="&set r=*
    for /f "tokens=1* delims==" %%b in ('set #') do set "s=!s!%%c"
    echo;!s!
    set /a b=m-%%a+n,c=m+%%a-n
    for /l %%c in (!b! 1 !c!) do (
        set /a d=%%c-1,e=%%c+1,h=c+1
        for %%i in (!d!) do set f=!#%%i!
        for %%j in (!e!) do set g=!#%%j!
        if "!f!" neq "!g!" (set t=*) else set "t= "
        for %%i in (!d!) do set #%%i=!r!
        set r=!t!
    )
    set #!c!=!t!&set #!h!=*
)
pauseCOPY
2

评分人数

TOP

Writing Code That Nobody Else Can Read.
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

本帖最后由 523066680 于 2017-3-18 09:56 编辑
my @lines = "*";
func( \@lines, 1 );
sub func
{
    my ($ref, $lv) = (shift, shift);
    my @tri;
    my $top = $#$ref + 1;
    grep { push @tri, "$_ $_" } @$ref;
    grep { unshift @tri, " "x$top .$_ ." "x$top } ( reverse @$ref );
    ( $lv <= 3 ) ?
         func( \@tri, $lv+1 ) : print join("\n", @tri);
}COPY
               *               
              * *              
             *   *            
            * * * *            
           *       *           
          * *     * *         
         *   *   *   *         
        * * * * * * * *        
       *               *      
      * *             * *      
     *   *           *   *     
    * * * *         * * * *   
   *       *       *       *   
  * *     * *     * *     * *  
*   *   *   *   *   *   *   *
* * * * * * * * * * * * * * * *COPY
1

评分人数

[url=][/url]

TOP

回复 17# taofan712


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

TOP

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

回复 22# happy886rr


    好的,收到
不用set输出的话……这种题不准备用批写了,太费劲

TOP

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

回复 21# 老刘1号
最后一版正常。

TOP

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

回复 1# happy886rr
兼容WIN7的来了
@echo off
Setlocal enabledelayedexpansion
::CODER BY Old.Liu POWERD BY iBAT
set /p long=Input:
set /a long=long/2
set /a long=long*2+1
set /a half=long/2
set /a i=1
set a=.
for /l %%a in (1 1 !half!) do set "a=!a! "
for /l %%a in (1 1 !i!) do set a=!a!*
echo!a!
if !long! == 1 goto end
:loop
set /a i+=2
set /a half-=1
set a=.
for /l %%a in (1 1 !half!) do set "a=!a! "
for /l %%a in (1 1 !i!) do set a=!a!*
echo!a!
if "!i!" equ "!long!" goto end
goto loop
:end
pauseCOPY

TOP

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

回复 19# happy886rr

夸张了 ,没试过字符版,好像可以先从直角开始。
my $floor = 5;
my $s = " "x$floor;
my @line;
for my $n ( 0 .. $floor-1 )
{
    $s=~s/ /*/;
    $line[$n] = $s;
}
for my $n ( $floor .. $floor*$floor - 1 )
{
    $line[$n] = $line[$n%$floor] x ($n/$floor+1);
}
print join("\n", @line);COPY

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



发现差远了,晚点儿补上
[url=][/url]

TOP

返回列表