มันเกือบจะคริสต์มาสแล้ว!


14

ด้วยเหตุนี้ครอบครัวจากทั่วทุกมุมโลกจึงสร้างต้นคริสต์มาส

แต่ต้นไม้ต้นนี้น่าเบื่อหลังจากผ่านไประยะหนึ่งลองสร้างต้นไม้ ASCII กันเถอะ!

ใบไม้จะถูกแทนด้วย#และจะต้องจัดเรียงตามที่แสดงในผลลัพธ์ตัวอย่าง เรามี 5 ลูก ( O) และ 5 ลูกกวาด ( J) ซึ่งเราวางสุ่มรอบ ๆ ต้นไม้ เรายังมีเทียนอยู่ด้านบน

อินพุต:ไม่มี

เอาท์พุท:

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

กฎ (หากไม่ได้อยู่ในกฎให้ถือว่าคุณทำได้)

  • ลูกบอลและลูกกวาดจะต้องวางสุ่มบนต้นไม้และต้องมีอย่างน้อยหนึ่งใบระหว่างพวกเขาไม่นับเส้นทแยงมุม

  • ใบไม้แต่ละใบจะต้องมีโอกาสไม่เป็นศูนย์ในการรับลูกบอลหรืออ้อยขนม

  • อาจมีช่องว่างนำหน้าหรือต่อท้ายในแต่ละบรรทัดตราบใดที่ต้นไม้มีรูปร่างที่เหมาะสม

  • นี่คือดังนั้นรหัสที่สั้นที่สุดในตัวละครชนะ


2
@Billywob เป็นคนใกล้ชิดคนนี้มีปัจจัยสุ่มและเทียนโท: P
สีเทา

1
ใช่นี่คือ imo ที่ยากขึ้นแน่นอนที่สุด
Billywob

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 'และต้องมีอย่างน้อยหนึ่งใบ (#) ในระหว่างนั้นไม่นับ diagonals'
user2216

@ user2216 เว้นแต่ฉันจะพลาดหรือเข้าใจผิดบางอย่างโมดูโล่ก็ถูกเลือกในลักษณะที่มันจะเกิดขึ้นไม่ได้ยกเว้นในแนวทแยงมุม (มี 13 รูปแบบที่แตกต่างกันที่คุณสามารถทดสอบโดยการแทนที่j=new Dateด้วยj=0การj=12.)
Arnauld

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หรือConsoleไม่ได้ meta.codegolf.stackexchange.com/questions/10081/…ขออภัยที่จะเพิ่ม 13 ไบต์ :(
Erresen

@Eresres: ขอบคุณสำหรับลิงค์! เท่าที่ฉันสามารถบอกได้มันพูดถึงเฉพาะการนำเข้าที่จำเป็นสำหรับการดำเนินการและสำหรับ cs-script using System;ไม่จำเป็นต้องใช้ (จะนำเข้า namespaces ทั่วไปโดยอัตโนมัติ) แต่บางทีฉันอาจแยกเส้นผม ¯_ (ツ) _ / ¯
amulware

ใครจะรู้! ฉันเริ่มเล่นเมื่อวันก่อนเท่านั้นเอง ไม่ทราบเกี่ยวกับสคริปต์ cs ก่อนที่จะเห็นคำตอบของคุณ มีประโยชน์จริง ๆ สำหรับการหลีกเลี่ยงข้อเสีย C # บางอย่างในการเล่นกอล์ฟ ไม่ว่าคำตอบคืออะไรฉันไม่คิดว่า ac # script จะชนะเมื่อใดก็ได้ในไม่ช้า
Erresen

ใช่แน่นอนมาก : D
amulware

ถ้าคุณคอมไพล์ฟังก์ชันถ้าเป็นไปได้ใน CS-Script คุณสามารถลดจำนวนไบต์เช่น_=>{var c=... return c;}
TheLethalCoder

4

TSQL, 556 532 494 476 ไบต์

สคริปต์นี้ต้องถูกเรียกใช้งานบนฐานข้อมูลหลัก

แข็งแรงเล่นกอล์ฟ:

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 @

Ungolfed:

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มันมากเกินไปสำหรับงูหลาม แต่ แต่ .....

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 ไบต์
Daniel Shillcock

ไม่อีกแล้วขอโทษ
Washington Guedes

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

สกาลา, 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.