もうすぐクリスマス!


14

このため、世界中の家族がクリスマスツリーを構築しています。

しかし、この通常のツリーはしばらくすると退屈になる可能性があるため、ASCIIツリーを作成しましょう。

リーフはで表され#、出力例に示すように配置する必要があります。5つのボール(O)と5つのキャンディー(J)があり、これらをツリーの周りにランダムに配置します。また、上にろうそくがあります。

入力:なし

出力:

         ^
         |
        ###
       ##O##
      #######
       #####
      ####J##
     #########
    ####O######
   #############
      ###J###
     #########
    ####O###J##
   #######O#####
  ###J########O##
 ###########J#####
        ###
        ###

ルール(ルールに含まれていない場合、できると仮定)

  • ボールとキャンディケインは木の上にランダムに置かれ、対角線を数えないで少なくとも1つの葉がそれらの間になければなりません。

  • 各葉には、ボールまたはキャンディケインを獲得するゼロ以外のチャンスが必要です。

  • ツリーが適切な形状である限り、各行に先頭または末尾のスペースが存在する場合があります。

  • これはなので、文字の中で最も短いコードが優先されます。


2
P:それは近い一つだ@Billywob、これは無作為化要因とカントーキャンドルあり
グレー

1
ええ、これは最も確かに難しいです。
ビリーウォブ

3
「しかし、この普通の木はしばらくすると退屈する可能性があります。」では、なぜ古い学校のろうそくが創造的なものではないのでしょうか?
マナトワーク

1
誰も言及していないので、メインに投稿する前に意味のあるフィードバックを取得し、課題を微調整できる将来の課題をSandboxに投稿することをお勧めします。
AdmBorkBork

1
このような回答がなければ、文字ではなくバイトでスコアリングすることをお勧めします。
デニス

回答:


4

JavaScript(ES6)、148バイト

うまくいけば、これは「十分にランダム」な条件に準拠するはずです。

_=>[...'887656543254321077'].map(n=>' '.repeat(n)+'#'.repeat(17-2*n)).join`
`.replace(/#/g,_=>'OJ^|#'[++i<4?i:i>133|++j%13?4:j/13&1],i=1,j=new Date)

デモ


私は、テストの結果、brokes「とそれらわたってるしき、少なくとも1つのリーフ(#)を持っている必要がありますが、対角線を数えていない」という木持っている
user2216を

@ user2216何らかの理由で何かを見逃したり誤解したりしない限り、モジュロは、対角線に沿った場合を除いて、起こり得ないような方法で選択されました。(13個の異なるパターンを使用すると置き換えることによってテストすることができることがあるj=new Datej=0するj=12。)
アルノー

8

CS-Script-306バイト

var c=new string(' ',342).ToCharArray();var r=new Random();int e=18,i,j,w;for(;i<e;i++){c[i*e+e]='\n';w=i<5?i:i<10?i-2:i<16?i-6:2;for(j=1;j++<w*2;)c[i*e+8-w+j]='#';}for(i=0;i<10;){j=37+r.Next(288);if(c[j]=='#'&c[j+1]<42&c[j-1]<42&c[j+e]<42&c[j-e]<42)c[j]=i++<5?'J':'O';}c[8]='^';c[27]='|';Console.Write(c);

書式設定とコメントをもう一度:

// create 'char bitmap' filled with spaces
var c=new string(' ',342).ToCharArray(); 
// Random for placing ornaments
var r=new Random();
int e=18,i,j,w;
// once for each row
for(;i<e;i++)
{
    // add new lines
    c[i*e+e]='\n';
    // determine width of tree for this row
    w=i<5?i:i<10?i-2:i<16?i-6:2;
    for(j=1;j++<w*2;)
        // add leaves
        c[i*e+8-w+j]='#';
}
for(i=0;i<10;)
{
    // select random location
    j=37+r.Next(288); 
    if( // check we have a leaf
        c[j]=='#' &
        // check surrounding to be leaf/space/new-line
        c[j+1]<42 & c[j-1]<42 & c[j+e]<42 & c[j-e]<42)
        // add ornament if location is valid
        c[j]=i++<5?'J':'O';
}
// light candle
c[8]='^';
c[27]='|';
// print
Console.Write(c);

基本的にはC#ですが、CS-Scriptを使用すると、すべての定型文をスキップできます。

ここで試してみてください!

ノート:

これは現在、ツリーの下に空白の別の行を出力し、「下にある既存の装飾を確認する」がIndexOutOfBoundsExceptionをスローしないようにします。他の解決策は次のとおりです。

  • 以下を確認する前に最後の行かどうかを確認します(さらに文字を追加します)
  • ツリーの「幹」に装飾を追加しない(同じバイト数ですが、ルールに反しているようです)

これを変更する必要がある場合は、OPに任せます。

最後に、これは私の最初のゴルフですので、フィードバックは大歓迎です。;)


いい解決策。using System;ただし、使用できないRandomか使用できないため、バイトカウントに含める必要があると思われますConsolemeta.codegolf.stackexchange.com/questions/10081/…13バイトを追加してすみません:(
Erresen

@Erresen:リンクをありがとう!私が知る限り、それは実行に必要なインポートについてのみ話し、cs-scriptにusing System;は必要ありません(一般的な名前空間を自動的にインポートします)。しかし、多分私は髪を分割しています。_(ツ)_ /¯
amulware

知るか!私は先日自分でプレイし始めただけです。あなたの答えを見る前にcsスクリプトについて知らなかった。ゴルフでのC#の不利な点を回避するのに本当に役立ちます。答えが何であれ、私はac#スクリプトがすぐに勝つとは思わない。
エレセン16

確かにそうです。:D
Amulware 16

あなたが関数にコンパイルした場合は、CS-スクリプトで可能な場合は、すなわちバイト数を減らすことができる_=>{var c=... return c;}
TheLethalCoder

4

TSQL、556 532 494 476バイト

このスクリプトはmasterデータベースで実行する必要があります

ゴルフ済み:

DECLARE @ varchar(max)='',@h INT=0,@w INT=0WHILE @h<18SELECT
@+=space(9-@w)+REPLICATE(char(IIF(@h<2,94+30*@h,35)),@w*2+1)+space(9-@w)+CHAR(10),@h+=1,@w+=CHOOSE(@h,0,1,1,1,-1,1,1,1,1,-2,1,1,1,1,1,-8,0)WHILE
@h>7WITH C as(SELECT*,substring(@,number,1)v,number/20r,number%20c
FROM spt_values WHERE type='P'and number<358)SELECT @=stuff(@,number,1,CHAR(74+@h%2*5)),@h-=1FROM
c d WHERE v='#'and not exists(SELECT*FROM c WHERE abs(d.c-c)+abs(d.r-r)<2and'A'<v)ORDER BY newid()PRINT @

ゴルフをしていない:

DECLARE @ varchar(max)='',@h INT=0,@w INT=0

WHILE @h<18
  SELECT @+=
    space(9-@w)+REPLICATE(char(IIF(@h<2,94+30*@h,35)),@w*2+1)
      +space(9-@w)+CHAR(10),
    @h+=1,
    @w+=CHOOSE(@h,0,1,1,1,-1,1,1,1,1,-2,1,1,1,1,1,-8,0)

WHILE @h>7
  WITH C as
  (
    SELECT*,substring(@,number,1)v,number/20r,number%20c
    FROM spt_values
    WHERE type='P'and number<358
  )
  SELECT @=stuff(@,number,1,CHAR(74+@h%2*5)),@h-=1
  FROM c d
  WHERE v='#'and not exists(SELECT*FROM c WHERE abs(d.c-c)+abs(d.r-r)<2and'A'<v)
  ORDER BY newid()

PRINT @

やってみよう


1

Python 3-450 427バイト

450はPythonには多すぎることを知っています。しかし、しかし.....

from random import randint as r
t=lambda o,g:(o*g).center(19,' ')+';';s,z='','#';s+=t(z,3)*2
for h,w in zip([6,5,3],[17,13,7]):
 for i in range(h):s+=t(z,w);w-=2
s+=t('|',1)+t('^',1);s=[list(i)for i in s.split(';')]
for o in'O'*5+'J'*5:
 while 1:
  h,w=r(2,15),r(1,16)
  m=s[h]
  C,m[w]=m[w],o
  P=s[h-1][w]+s[h+1][w]+m[w-1]+m[w+1]
  if not('O'in P or'J'in P)and C!=' ':break
  m[w]=C
print (*[''.join(i)+'\n'for i in s][::-1])

より良い再帰関数for i in'O'*...に変換された場合、大量のバイトを削減できます。

ここで試してみてください

編集

;区切り文字として使用して2バイトを節約し、改行バイト数を1バイトとして数バイトを節約しました。


1

JavaScript、204バイト

f=(s='^|1232345634567811'.replace(/./g,x=>(y=x|0,' '.repeat(8-y)+(y?'#'.repeat(y*2+1):x)+`
`)),o=5,j=5,r=(Math.random()*56|0)*4,k)=>j?f(s.replace(/###/g,(_,i)=>i-r?_:k=o?'#O#':'#J#'),k?o-!!o:o,k?j-!o:j):s

console.log(f());
.as-console-wrapper{max-height:100%!important;top:0}


1
なぜ\n1バイトとして数えているのですか?
ダニエルシルコック16

申し訳ありません
ワシントンゲデス

1

PHP、200バイト

より洗練されたアプローチでは短くなる可能性があります。しかし、私は急いでいます。

for(;$c="^|2343456745678922"[$i++];)$s.=str_pad(+$c?str_pad("",2*$c-1,"#"):$c,17," ",2)."
";for(;$n++<10;)$s[$p=rand(0,288)]!="#"|($s[$p-18]|$s[$p+18]|$s[$p-1]|$s[$p+1])>A?$n--:$s[$p]=OJ[$n&1];echo$s;

PHP 5.6または7.0が必要です。で実行する-nr、オンラインで試してください


0

Scala、329バイト

var r=scala.util.Random;var z=r.nextInt(2);def t{print(new StringBuilder({"^|234345645678922".map(x=>{val t=if(x>57)8 else(57-x);" "*t+{if(x>57)""+x else "#"}*(17-(t*2))+" "*t+" \n"})}.mkString)match{case e=>{var w=0;while(w<10){{val b=(r.nextInt(e.size/2)*2)+z;if(e.charAt(b)=='#'){e.setCharAt(b,if(w<5)'O'else'J');w+=1}}};e}})}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.