打印圣诞树


26

挑战

使用最短的代码在顶部打印自己的星星的漂亮圣诞树。树星是一个星号(*),树体是由树制成的0。树必须高10行。每行应适当缩进,以使上一行在下一行居中。任何给定的行都必须比前一行多2个0,除了第一个是星星,第二个只有一个0。结果是这样的:

          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

无需更改软件即可更改高度的高度树的并列中断(更改高度参数除外)

请也粘贴代码的结果树!


排行榜


Answers:


17

Golfscript,27个字符

" "9*"*"9,{n\.4$>\.+)"0"*}%

生成的树如下所示:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

仅使用一次height参数的版本长一个字符:

9." "*"*"@,{n\.4$>\.+)"0"*}%

从stdin读取高度(输入“ 10”以生成示例树)需要使用相同数量的字符(28):

~,)" "*"*"@{n\.4$>\.+)"0"*}%

56

我知道这不符合规范,但我想我会通过模仿Joan G. Stark的经典ASCII艺术圣诞节场景,在此处增加树木的多样性。

我没有尝试重现整个图片,这可能有点太多了,但是我只想重现一棵树,为此我展示了这个138字节的Perl程序:

$_=join$/,qw'11| 8\2_2/ 9(\o/) 5---2/1\2--- 10>*<',map(11-$_.A.AA x$_,2..11),'9\|H|/';s/\d+/$"x$&/eg,s/A/substr">>>@*O<<<",rand 9,1/eg,say

当然,这是输出示例:

           |
        \  _  /
         (\o/)
     ---  / \  ---
          >*<
         >O><@
        <><<>><
       @><><>@<<
      @<O><*@*>>O
     OO@@*O<<<*<OO
    ><<>@><<>@<><><
   >><O<>>><@*>>><<O
  *<>*<><<>@><O*>><*<
 O><><<@<*>><O*@>O><>*
O<><<><@O>>*O*OO<><<>O>
         \|H|/

在线尝试!

该代码使用Perl 5.10+ say功能,因此需要使用-M5.010(或-E)命令行开关来运行。(实际上,仅用替换say末尾print将避免这种情况,以增加两个字节为代价,并且在输出的最后一行之后会丢失换行符。)

请注意,树的大部分是随机生成的,因此装饰的位置将在运行之间有所不同。不过,天使,树桩和树的顶行是固定的。


为了避免这个流行的答案在发布后根据其制定的政策被立即删除,这也是一种符合令牌规范的解决方案(45字节,也包括Perl 5):

$_=$"x10 ."*";say,s/ 0/00/,s/\*?$/0/ while/ /

在线尝试!

与上面的程序一样,该程序也需要在Perl 5.10+上运行,并带有-M5.010开关才能启用该say功能。显然(这是一个挑战),它会产生与所有其他兼容条目完全相同的无聊输出,在此我不再赘述。(也可以通过将数字更改为10其他任何值来轻松调整大小。)


1
大!不是按规格,但我认为法官特别奖是给你的!:)
Averroes

6
这使规格的谚语落后了,如果可以的话,+ 2。
克里斯(Kris)

3
抱歉,但是根据规则,必须删除不符合规范的答案。
mbomb007 '16


1
您能否将有效答案移到顶部并添加标题?
丹尼斯

13

GolfScript(33个字符)

固定高度版本:

;8:^' '*.'*'+\'0'+^{.(;'00'+}*]n*

或长度完全相同

;8:^' '*.'*'+n@'0'+^{.n\(;'00'+}*

这棵树看起来与其他所有人都非常相似:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

从标准输入开始变高的版本:

~((:^' '*.'*'+\'0'+^{.(;'00'+}*]n*

前一行的开始是我在“有用的” GolfScript程序中做出的更好的表情符号之一。


10

Shell脚本,44个字符

printf %9c\\n \* 0|sed ':x
p;s/ 0/000/;tx
d'

打印此树:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

9

枫树,30/37个字符

受到Wizard先生的Mathematica条目的启发,我提出了这个30个字符的Maple 12命令:

<`*`,('cat(0$2*i+1)'$i=0..8)>;

输出:

                              [        *        ]
                              [                 ]
                              [        0        ]
                              [                 ]
                              [       000       ]
                              [                 ]
                              [      00000      ]
                              [                 ]
                              [     0000000     ]
                              [                 ]
                              [    000000000    ]
                              [                 ]
                              [   00000000000   ]
                              [                 ]
                              [  0000000000000  ]
                              [                 ]
                              [ 000000000000000 ]
                              [                 ]
                              [00000000000000000]

我还可以用另外七个字符来摆脱括号:

`*`;for i in$0..8 do;cat(0$2*i+1);od;

省略了输出-看起来和上面一样,只是没有括号。不幸的是,我不知道有什么方法可以阻止Maple在文本模式下在输出行之间插入空白行。在经典工作表模式下看起来更好。我想我可以包括一张屏幕截图...

屏幕截图

(屏幕快照显示了该命令的早期版本的44字符版本,但是我懒得重新使用它。输出仍然相同。)

哦,是的,大小是完全可调节:只需更换8 ñ -2对于ñ -行树。在第一种解决方案中,要超过25行(或GUI中为10行),还需要设置interface(rtablesize = n)。

(注:我认为我已经设法用最新版本击败了GolfScript但是a ...


8

Perl,42个字符

say$"x9,"*";say$"x(9-$_),"00"x$_,0for 0..8

输出:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

通过将8末尾的替换为从-1到的值,可以在1至11行之间更改树的高度9。要超过11行,还需要9在代码的前面增加2 ,这控制了树向屏幕左侧缩进的距离。


该行有11行:P我猜是较小的更改
Averroes

@Averroes:是的,我首先假定它应该是10行星号,但实际上我计算了示例输出中的行并将其固定。
Ilmari Karonen 2011年

8

Groovy,65岁

(p={c,r->println' '*(9-r)+(c*(r*2-1))})'*',1;(1..9).each{p'0',it}

令人惊讶的是,树看起来像这样:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

“发布树后输出”部分的目的是为该网站带来一些圣诞节
气氛

另外,您也有11行!
Averroes

我可以通过调整height参数来解决这个问题!
Armand

8

Ruby,46个字符

puts" "*8+?*;9.times{|i|puts"%8s0"%(v=?0*i)+v}

为了更改高度,您必须同时更改8s和9。程序的输出如下:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

编辑:不可原谅,我在第一次提交中省略了输出。


1
您忘记了发布输出。:)
Ilmari Karonen 2011年

7

PowerShell,41岁

" "*8+"*";0..8|%{" "*(8-$_)+"0"+"0"*$_*2}

毫不奇怪,输出与其他人相同的树:-p

如果您将参数8设置为参数,它将产生您的控制台大小,例如48个字符

" "*($w=8)+"*";0..$w|%{" "*($w-$_)+"0"+"0"*$_*2}

或者,作为一个完整的带有参数的脚本,它包含53个字符

param($w)" "*$w+"*";0..$w|%{" "*($w-$_)+"0"+"0"*$_*2}

称为,看起来像:

PS>: Get-Tree.ps1 8
        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

7

Python 3:62个字符

print(' '*9+'*',*('\n'+' '*(9-i)+'0'*(i*2+1)for i in range(9)))

输出:

        * 
        0 
       000 
      00000 
     0000000 
    000000000 
   00000000000 
  0000000000000 
 000000000000000
00000000000000000

请注意,这实际上比@Ante的答案高11个字符,因为当转换为Python 3时,该答案使用73个字符。

将每个9值更改为另一个高度的值。


3
我认为您也可能失去之前的空间for
badp 2011年

@badp谢谢-从63变为62!
哈扎克(Kazark)

6

Python,59岁

print' '*9+'*'
for i in range(9):print' '*(9-i)+'0'*(i*2+1)

不错的工作-这表明,尽管@Ante的答案在Python 3中变长了,但我的Python 3答案在Python 2中却变短了(print不是函数)。
卡扎尔克

6

序言:183或186

r(0,_,L,L).
r(N,C,L,[C|T]):-N>0,M is N-1,r(M,C,L,T).
y(S,T,C):-r(T,C,[10],X),r(S,32,X,Y),atom_codes(A,Y),write(A).
x(A,B):-A>0,y(A,B,48),C is A-1,D is B+2,x(C,D).
x(N):-y(N,1,42),x(N,1).

印刷品:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000
false.

对于某些口译员可能会受到进一步挤压(例如,使用SWI上的tab / 1)

用x(N)调用。其中N是实际树中的行数(不包括星号)。将其设置为固定高度会将其降低到183


6

C

这是Wade Tandy的C版本,但做了一些修改:

           ;
          int
         main(
        ){int i
       =-1,j=0,c
      =10;while(j
     ++<c){printf(
    " ");}{;printf(
   "*");}while(++i<c
  ){for(j=-2;++j<c-i;
 )printf(" ");for(j=0;
++j<2*i;){printf("0");}
          ;;;
        printf(
         "\n")
          ;}}


5

Applesoft BASIC,143个字符

由于这个问题使我想起了我上高中时的一项家庭作业(当他们在Apple // e上教书时):

1INPUTH:X=(H*2)-2:C=(X/2):S$="*":O=0:GOSUB2:S$="0":FORO=0TOX-2STEP2:GOSUB2:NEXT:END
2FORS=0TOC-(O/2):?" ";:NEXT:FORI=0TOO:?S$;:NEXT:?"":RETURN

我使用了JavaScript Applesoft BASIC,网址为:http : //www.calormen.com/applesoft/

输出:

?10
          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

5

序言:127个字符

p:-write('        *'),h(1).
h(L):-(L<10,nl,w(L,-8),h(L+1));!.
w(L,N):-(N<9,N<L,(L>abs(N)->write('0');write(' ')),w(L,N+1));!.

输出:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000
true 

Prolog之所以使用,是因为如果Groovy不查看他的代码,我就无法打破记录:(。


5

PostScript(带有参数化的高度),114个字符

/h 9 def/b{{( )=print}repeat}def
h -1 0{dup h eq{dup b(*)=}if dup b h sub neg 2 mul 1 add{(0)=print}repeat()=}for

输出:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000
0000000000000000000

什么,您要打印出来吗?


4

JavaScript(Rhino:108,Node:114,Webkit Dev Console:119,jQuery Plugin:132)


Rhino最短(108个字符),因为(a)它的print函数有一个短名称,并且(b)它允许您将内置函数分配给一个较短的变量名。所以:

h=10,p=print,m='0',a=Array(h-1),s=a.join(' ');p(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();p(a.join(' ')+m);}


Node.js紧随其后(以114个字符为单位),因为它的打印函数console.log具有更长的名称,但是它也让我们将其分配给一个短变量:

h=10,p=console.log,m='0',a=Array(h-1),s=a.join(' ');p(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();p(a.join(' ')+m);}


但是,Webkit开发控制台(也许还有Firebug)认为p=console.log这有点太偷偷摸摸(当您尝试致电时p(),它会向您抱怨)。因此,我们必须将内容延长到119个字符:

h=10,m='0',a=Array(h-1),s=a.join(' ');with(console){log(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();log(a.join(' ')+m);}}

(有趣的是,with只为我们节省了角色)。


最后...一个jQuery插件(仍然可以在132个字符上发推!):

$.fn.xms=function(h){var m='0',w=2,l=['*',m];while(w++<h)l.push(m+='00');$(this).css({textAlign:'center'}).html(l.join('\n<br/>'));}

您可以在此页面的页脚处调用它: $('#footer').xms(3)

当然,它不必一定是插件...因为我们可能必须使用JavaScript控制台将其添加到页面并调用它,所以我们只需编写一小段jQuery

h=10,m='0',w=2,l=['*',m];while(w++<h)l.push(m+='00');$('#footer').css({textAlign:'center'}).html(l.join('\n<br/>'));

它具有更具竞争力的116个字符-实际上,它击败了其他开发者控制台实现。但是,话又说回来,使用jQuery和/或浏览器的布局引擎可能被认为是作弊行为。:)


4

C,67

我知道这已经结束了,但这是我第一次尝试代码高尔夫球,而且我认为我有一个非常不错的C解决方案。

有趣的是,我独立于@Patrick的非常相似的解决方案而提出了此解决方案。

是的,我不会用我的硬编码值赢得任何联系;)无论如何,我都很高兴。

i;main(){for(;i<10;++i)printf("%*s%0*c\n",i?9-i:8,"",i*2,i?32:42);}
        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000
按任意键继续 。。。

4

甲骨文

select lpad('*', 11) from dual
union all
select rpad(' ', 10 - level) || rpad(' ', level * 2, '0') from dual
connect by level <= 9;


          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

10 rows selected.


4

LOLCODE,527字节

CAN HAS STDIO?
HAI 1.2
IM IN YR LOOP UPPIN YR VAR TIL BOTH SAEM VAR AN 8
    VISIBLE " "!
IM OUTTA YR LOOP
VISIBLE "*"
I HAS A SPACES
SPACES R 8
I HAS A ZEROS
ZEROS R 1
IM IN YR LOOP UPPIN YR VAR TIL BOTH SAEM VAR AN 9
    IM IN YR LOOP UPPIN YR VAR2 TIL BOTH SAEM VAR2 AN SPACES
        VISIBLE " "!
    IM OUTTA YR LOOP
    IM IN YR LOOP UPPIN YR VAR2 TIL BOTH SAEM VAR2 AN ZEROS 
        VISIBLE "0"!
    IM OUTTA YR LOOP
    VISIBLE ""
    SPACES R DIFF OF SPACES AN 1
    ZEROS R SUM OF ZEROS AN 2
IM OUTTA YR LOOP
KTHXBYE

在线尝试!

输出:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

1
这是code-golf,因此请将您提交的字节数添加到标头中。
lirtosiast 2015年

4

Python,70个字符

不太短,但是递归解决方案:-)

def a(s):
 print s
 if s<"0":a(s[1:]+"00")
print" "*8+"*"
a(" "*8+"0")

更改8以设置高度。


4

Javascript,119个字符

输出到Firebug控制台

i=h=9;a=new Array(h);a[0]=a.join(' ');b=a.join('000');a[0]+='*';while(i)a[i--]=b.substr(i,h+i);console.log(a.join('\n'))


        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

2
这实际上是120个字符。
罗布·福克斯

3

PHP 113

想通了,我会用一个PHP版本:

113个字符(调整$h以更改高度,行数包括星号):

$h=10;for($n=0;$n<$h;$n++){$i=$n>0?$n:1;$c=$n<1?"*":"0";echo str_repeat(" ",$h-$i).str_repeat($c,($i*2)-1)."\n";}

我试图使它简短而不可读,我们已经知道php不能在简洁上竞争,所以这不会赢得任何东西,仍然是一个有趣的小难题。

输出如下:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

硬编码一个小字符,为103个字符,(您看不到此注释中的第一个回声中的空格)$ n = 0; echo“ * \ n”; for($ i = 9; $ i> 0; $ i--,打印str_repeat('',$ i).str_repeat('0',$ n + 9- $ i)。“ \ n”,$ n ++);
露西亚

如果您更改树的高度,则硬编码的第一行将失去平衡:-(
Kris,

3

C,77

i;main(c){printf("%*c\n",c,42);while(i<c)printf("%*s%0*d\n",c-i,"",i++*2+1,0);}

在更仔细地阅读printf规范之前,我有这个可爱的小数字,最小为138个字符:

#define x sprintf(b,
#define y printf(b,
i;main(c){char b[9]="%%%dc\n",*t="%%%ds%%0%dd\n";x b,c);y 42);while(i<c)x t,c-i,i++*2+1),y "",0);}

3

Java 192(带有参数的198)

class V{public static void main(String[]a){int c=10,i=-1,j=0;String s="";while(j++<c)s+=" ";s+="*";while(++i<c){for(j=-2;++j<c-i;)s+=" ";for(j=0;++j<2*i;)s+="0";System.out.println(s);s="";}}}

打印请求的树:

        *           
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

对于可变高度,稍长一些:

class W{public static void main(String[]a){int c=a.length,i=-1,j=0;String s="";while(j++<c)s+=" ";s+="*";while(++i<c){for(j=-2;++j<c-i;)s+=" ";for(j=0;++j<2*i;)s+="0";System.out.println(s);s="";}}}

命令行参数列表的长度确定高度(例如,java W a a a a a将给出高度5)。

(这基本上是Wade Tandy的C解决方案的Java版本。)


我知道这是前一阵子发布的:),但是我看到了两件事:1. 您可以在Java 8中使用接口而不是类 2.保存两个字符while (++i < c) {-> for (s += "*";++i < c;s = "") {,并删除s += "*";s = "";
Reinis Mazeiks

3

Vim,18个字节

17i0<esc>qqYPxr q8@qa*

在向后兼容的V解释器中在线尝试

尽管这与我的V答案非常相似,但是由于vim太老了,所以这不是竞争。:)

说明:

17i0<esc>               " Insert 17 '0's
         qq     q       " Start recording into register 'q'
           YP           " Duplicate this line upwards
             x          " Delete one character
              r         " Replace this character with a space
                 8@q    " Playback macro 'q' 8 times
                    a*  " Append an asterisk

3

Scala,74个字节

val h=10;println(" "*h+"*");for(i<-0 to h-2)println(" "*(h-i)+"0"*(i*2+1))

h -树的高度

输出量

        *          
        0          
       000         
      00000        
     0000000       
    000000000      
   00000000000     
  0000000000000    
 000000000000000   
00000000000000000  

2

C,80

i=9,k=10,j;main(F){while(i)putchar(++j<i?32:j<k?48-F*6:(i-=!F,k+=!F,F=j=0,10));}

初始化k为树的高度,i为k-1。F是第一行标志。如果不指定参数,则F在输入时应为1。

稍长一点的(81)版本,其中f是非第一行标志:

i=9,k=10,j,f;main(){while(i)putchar(++j<i?32:j<k?42+f*6:(i-=f,k+=f,f=1,j=0,10));}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.