快到圣诞节了!


14

因此,来自世界各地的家庭正在建造圣诞树。

但是一段时间后,这棵普通的树可能会变得无聊,所以让我们制作一个ASCII树!

叶子由表示,#并且必须按照示例输出所示进行排列。我们有5个球(O)和5个糖果棒(J),我们将它们随机放置在树上。我们还在上面放了一支蜡烛。

输入:

输出:

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

规则(如果不在规则中,则假设可以)

  • 球和棒棒糖必须随机放置在树上,并且它们之间至少要有一片叶子,不包括对角线。

  • 每片叶子必须有非零的机会拿到球或棒棒糖。

  • 只要树的形状正确,每行上可能会有前导或尾随空格。

  • 这是,因此字符中最短的代码将获胜。


2
@Billywob这是一个接近的,这有一个随机因素和一个蜡烛,::P
Gray Gray

1
是的,这无疑是更困难的imo。
Billywob '16

3
“但是这棵普通的树过一会儿就会变得无聊。” 那为什么旧式蜡烛又没有创意呢?
manatwork 2013年

1
既然没有其他人提到过,我建议您将以后的挑战发布到沙盒中,在将其发布到Main之前,您可以获得有意义的反馈和调整挑战。
AdmBorkBork '16

1
如果你不回答,看起来像这样,我通过字节,而不是字符提示得分。
丹尼斯

Answers:


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)

演示版


我测试过并且断掉了一棵树,“它们之间必须至少有一片叶子(#),不包括对角线”
user2216

@ user2216除非我以某种方式错过或误解了某些内容,否则以不可能发生的方式选择了模数-除了沿对角线。(您可以通过替换j=new Datej=0来测试13种不同的模式j=12。)
Arnauld 2016年

8

CS脚本-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;在您的字节数来,因为你不能使用RandomConsole没有它。meta.codegolf.stackexchange.com/questions/10081/…很抱歉添加13个字节:(
Erresen

@Erresen:感谢您的链接!据我所知,尽管它只讨论执行所需的导入,而对于cs-script using System;则不需要(它会自动导入通用名称空间)。但是也许我正在割头发。¯_(ツ)_ /
¯– amulware

谁知道!我只是在第二天才开始玩。在看到您的答案之前不了解CS脚本。对于避免打高尔夫球中的某些C#缺陷确实很有用。无论答案是什么,我都不认为ac#脚本会很快赢得胜利。
Erresen

可以肯定的是,是的。:D
amulware

如果编译为函数,则可以在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
为什么要算\n为1个字节?
丹尼尔·希尔科克

抱歉,现在不再是了
华盛顿瓜迪斯

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}})}
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.