クリスマスツリーを印刷する


26

チャレンジ

最短のコードを使用して、上部に星印を付けた素敵なクリスマスツリーを印刷します。ツリーの星はアスタリスク(*)で、ツリーの本体はで作られてい0ます。ツリーの高さは10行でなければなりません。すべての行は、前の行が次の行の中央にくるように適切にインデントする必要があります。最初の行が星で、2番目の行が1つだけである場合を除いて、指定された行には前の行よりも2多い0が必要です。結果は次のようになります。

          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

ソフトウェアを変更せずにサイズ変更可能な高さツリーのタイブレーク(高さパラメーターの変更を除く)

作成したコードのツリーも貼り付けてください!


リーダーボード


回答:


17

Golfscript、27文字

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

結果のツリーは次のようになります。

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

heightパラメーターを1回だけ使用するバージョンは、1文字長くなります。

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それが回避されます。ただし、さらに2バイトのコストがかかり、出力の最後の行の後の改行が失われます。)

ツリーの大部分はランダムに生成されるため、装飾の配置は実行ごとに異なることに注意してください。ただし、天使、スタンド、木の一番上の列は固定されています。


この人気のある回答が投稿された後に制定されたポリシーの下で即座に削除されないようにするために、トークン仕様に準拠したソリューションもあります(45バイト、Perl 5):

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

オンラインでお試しください!

上記のプログラムと同様に、この機能-M5.010を有効にするにはスイッチを使用してPerl 5.10以降で実行する必要がありますsay。明らかに(これはチャレンジです)、他のすべての準拠エントリとまったく同じ退屈な出力を生成しますが、ここでは繰り返しません。(数値10を他の値に変更することにより、簡単にサイズ変更することもできます。)


1
すばらしいです!仕様ではありませんが、審査員特別賞はあなたのためだと思います!:)
アベロス

6
これは仕様のことわざを裏付けるもので、できれば+2です。
クリス

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プログラムで作成した優れたスマイリーの1つです。


10

シェルスクリプト、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文字

Mr.WizardのMathematicaエントリに触発され、この30文字のMaple 12コマンドを紹介します。

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

出力:

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

さらに7文字のコストでブラケットを削除することもできます。

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

出力は省略されました—括弧なしでのみ上記のように見えます。残念ながら、テキストモードでMapleが出力行の間に空白行を挿入しないようにする方法はわかりません。従来のワークシートモードでは見た目が良くなります。スクリーンショットを含めることができると思います...

スクリーンショット

(スクリーンショットはコマンドの以前の44文字バージョンを示していますが、私はそれを取り直すのが面倒です。出力は同じです。)

ああ、はい、サイズは完全に調整可能です。n行のツリーの場合は、8をn -2に置き換えるだけです。最初のソリューションでは、25行(またはGUIでは10)を超えるには、interface(rtablesize = n)も設定する必要があります。

(Ps。最新バージョンでGolfScript勝つことができたと思っていましたが、残念ながら...


8

Perl、42文字

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

出力:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

ツリーの高さは、1から11行の間8で、末尾の値をから-1に置き換えることで変更できます9。11行を超えるに9は、コードの前の2を増やす必要があります。これは、ツリーが画面の左側からインデントされる距離を制御します。


この1は11行を持っている:Pマイナーは私が推測するに変更
アベロエス

@Averroes:ええ、最初は10行星を想定していましたが、実際にサンプル出力の行を数えて修正しました。
イルマリカロネン

8

グルーヴィー、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

「木の出力をポスト」の部分は、このサイトにいくつかのクリスマスの精神を持って来るためにある:P
アベロエス

また、11行もあります!
アベロス

高さパラメーターを調整することで修正できます!
アルマン

8

ルビー、46文字

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

高さを変更するには、8ともちろん9の両方を変更する必要があります。プログラムの出力は次のとおりです。

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

編集:最初の提出では、残念ながら出力を省略しました。


1
出力を投稿するのを忘れました。:)
イルマリカロネン

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の回答がPython 3に変換されたときに73文字を使用するため、本質的に@Anteの回答を11文字上回ることに注意してください。

それぞれを変える 9異なる高さのを別の値に。


3
前にスペースを失うこともあると思いますfor
badp

@badpありがとう— 63から62に変更されました!
カザール

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

これはウェイドタンディの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は(a)そのprint関数には短い名前があり、(b)組み込み関数を短い変数名に割り当てることができるため、(108文字で)最短です。そう:

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は、印刷機能のconsole.log名前が長いため、すぐに(114文字で)入りますが、短い変数にも割り当てることができます。

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 Dev Console(そしておそらく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なので、提出のバイトカウントをヘッダーに追加してください。
リルトシアスト

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-、print str_repeat( ''、$ i).str_repeat( '0'、$ n + 9- $ i)。 "\ n"、$ n ++);
ルシア

ツリーの高さを変更すると、ハードコードされた最初の行のバランスが崩れますtho :-(
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つの文字を保存するために2、while (++i < c) {- > for (s += "*";++i < c;s = "") {、および削除s += "*";s = "";
Reinisをマジークス

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になります。

fが最初の行以外のフラグであるわずかに長い(81)バージョン:

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));}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.