Nó gần như Giáng sinh!


14

Bởi vì điều này, các gia đình từ khắp nơi trên thế giới đang xây dựng cây Giáng sinh.

Nhưng cây bình thường này có thể trở nên nhàm chán sau một thời gian, vì vậy hãy tạo một cây ASCII!

Các lá được đại diện bởi #và phải được sắp xếp như thể hiện trong đầu ra ví dụ. Chúng tôi có 5 quả bóng ( O) và 5 cây kẹo ( J), chúng tôi đặt ngẫu nhiên quanh cây. Chúng tôi cũng có một cây nến trên đầu.

Đầu vào: không có

Đầu ra:

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

Quy tắc (nếu không có trong quy tắc, giả sử bạn có thể)

  • Bóng và gậy kẹo phải được đặt ngẫu nhiên trên cây và phải có ít nhất một lá giữa chúng, không tính các đường chéo.

  • Mỗi lá phải có cơ hội khác không để lấy một quả bóng hoặc một cây gậy kẹo.

  • Có thể có không gian hàng đầu hoặc dấu trên mỗi dòng, miễn là cây có hình dạng phù hợp.

  • Đây là , vì vậy mã ngắn nhất trong các ký tự sẽ thắng.


2
@Billywob đó là một cái gần gũi, cái này có một yếu tố ngẫu nhiên và một cây nến tho: P
Gray

1
Vâng, điều này chắc chắn là khó khăn hơn imo.
Billywob

3
Sau một thời gian, cây bình thường này có thể trở nên nhàm chán. Tại sao cây nến cũ và không phải là thứ gì đó sáng tạo ?
manatwork

1
Vì không có ai khác đề cập, tôi sẽ khuyên bạn nên đăng các thử thách trong tương lai lên Sandbox nơi bạn có thể nhận được phản hồi có ý nghĩa và điều chỉnh các thách thức trước khi bạn đăng chúng lên Main.
admBorkBork

1
Nếu bạn không trả lời giống như thế này , tôi khuyên bạn nên ghi điểm bằng byte thay vì ký tự.
Dennis

Câu trả lời:


4

JavaScript (ES6), 148 byte

Hy vọng, điều này sẽ tuân thủ điều kiện 'đủ ngẫu nhiên'.

_=>[...'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)

Bản giới thiệu


Tôi đã thử nghiệm và có một cái cây "và phải có ít nhất một lá (#) nằm giữa chúng, không tính các đường chéo"
user2216

@ user2216 Trừ khi tôi bằng cách nào đó đã bỏ lỡ hoặc hiểu nhầm điều gì đó, modulo được chọn theo cách mà nó không thể xảy ra - ngoại trừ dọc theo các đường chéo. (Có 13 mẫu khác nhau mà bạn có thể kiểm tra bằng cách thay thế j=new Datevới j=0tới j=12.)
Arnauld

8

CS-Script - 306 byte

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);

Một lần nữa với định dạng và bình luận:

// 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);

Về cơ bản là C #, nhưng sử dụng CS-Script cho phép tôi bỏ qua tất cả các nồi hơi.

Hãy thử nó ở đây!

Ghi chú:

Điều này hiện xuất ra một dòng khoảng trắng khác bên dưới cây để đảm bảo rằng 'kiểm tra các đồ trang trí hiện có bên dưới' không ném IndexOutOfBoundException. Các giải pháp khác sẽ là:

  • Kiểm tra nếu đó là dòng cuối cùng trước khi kiểm tra bên dưới (thêm một vài ký tự)
  • Không thêm đồ trang trí vào 'thân' của cây (Cùng số byte, nhưng dường như tôi trái với quy tắc)

Tôi sẽ để nó cho OP nếu điều này nên được thay đổi.

Cuối cùng, đây là sân golf đầu tiên của tôi, vì vậy bất kỳ phản hồi nào cũng được đánh giá cao. ;)


Giải pháp tốt đẹp. Nó nghĩ rằng bạn có thể cần phải bao gồm using System;trong số byte của bạn, vì bạn không thể sử dụng Randomhoặc Consolekhông có nó. meta.codegolf.stackexchange.com/questions/10081/, Xin lỗi để thêm 13 byte :(
Erresen

@Erresen: Cảm ơn đã liên kết! Theo như tôi có thể nói, nó chỉ nói về nhập khẩu cần thiết để thực thi và đối với cs-script using System;là không cần thiết (nó tự động nhập các không gian tên phổ biến). Nhưng có lẽ tôi đang chia tóc. _ (ツ) _ /
amulware

ai biết! Tôi chỉ bắt đầu chơi vào ngày khác. Không biết về tập lệnh cs trước khi xem câu trả lời của bạn. Thực sự hữu ích để tránh một số nhược điểm C # trong việc chơi golf. Dù câu trả lời là gì, tôi không nghĩ ac # script sẽ sớm giành chiến thắng.
Erresen

Điều đó là chắc chắn, yeah. : D
amulware

Nếu bạn biên dịch thành một hàm, nếu có thể trong CS-Script, bạn có thể giảm số byte tức là_=>{var c=... return c;}
TheLethalCoder

4

TSQL, 556 532 494 476 byte

Kịch bản này cần được thực thi trên cơ sở dữ liệu chủ

Chơi gôn

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 @

Ung dung:

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 @

Dùng thử


1

Python 3 - 450 427 byte

Tôi biết 450là quá nhiều cho python. Nhưng nhưng.....

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])

Nếu for i in'O'*...biến thành một hàm đệ quy tốt hơn thì rất nhiều byte có thể bị cắt giảm.

Hãy thử nó ở đây

Chỉnh sửa :

Đã lưu 2 byte bằng cách sử dụng ;làm dấu phân cách và một vài byte bằng cách lấy byte byte dòng mới là 1 byte.


1

JavaScript, 204 byte

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
tại sao bạn lại tính \nlà 1 byte?
Daniel Shillcock

Không còn nữa, xin lỗi
Washington Guedes

1

PHP, 200 byte

có thể ngắn hơn với cách tiếp cận tinh vi hơn; nhưng tôi vội vàng.

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;

yêu cầu PHP 5.6 hoặc 7.0. Chạy với -nrhoặc thử trực tuyến .


0

Scala, 329 byte

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}})}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.