इट् 'स आलमोस्ट क्रिसमस!


14

इस वजह से, दुनिया भर के परिवार क्रिसमस पेड़ों का निर्माण कर रहे हैं।

लेकिन यह सामान्य पेड़ थोड़ी देर के बाद उबाऊ हो सकता है, तो चलो एक ASCII पेड़ बनाते हैं!

पत्ती द्वारा प्रतिनिधित्व किया जाता है #और उदाहरण के आउटपुट में दिखाया जाना चाहिए। हमारे पास 5 गेंदें ( O) और 5 कैंडी कैन ( J) हैं, जिन्हें हम पेड़ के चारों ओर बेतरतीब ढंग से रखते हैं। हमारे पास ऊपर एक मोमबत्ती भी है।

इनपुट: कोई नहीं

आउटपुट:

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

नियम (यदि यह नियमों में नहीं है, तो आप मान सकते हैं)

  • बॉल्स और कैंडी कैन को बेतरतीब ढंग से पेड़ पर रखा जाना चाहिए और उनके बीच कम से कम एक पत्ती होनी चाहिए, न कि विकर्णों की गिनती।

  • प्रत्येक पत्ती में एक गेंद या एक कैंडी बेंत होने की गैर-शून्य संभावना होनी चाहिए।

  • प्रत्येक पंक्ति पर अग्रणी या अनुगामी स्थान हो सकते हैं, जब तक कि पेड़ का उचित आकार न हो।

  • यह , इसलिए पात्रों में सबसे छोटा कोड जीत जाता है।


2
@ बिलीवॉब यह एक करीबी है, इस एक के पास एक यादृच्छिक कारक और एक मोमबत्ती थो है: पी
ग्रे

1
हाँ, यह सबसे निश्चित रूप से अधिक कठिन imo है।
बिलीवॉब

3
"लेकिन यह सामान्य पेड़ थोड़ी देर बाद उबाऊ हो सकता है।" फिर पुराने स्कूल की मोमबत्ती और कुछ रचनात्मक क्यों नहीं ?
मैनटवर्क

1
चूंकि किसी और ने उल्लेख नहीं किया है, इसलिए मैं अनुशंसा करूंगा कि आप भविष्य की चुनौतियों को सैंडबॉक्स में पोस्ट करें जहां आप मेन पर पोस्ट करने से पहले सार्थक प्रतिक्रिया और ट्विक चुनौतियों को प्राप्त कर सकते हैं।
AdmBorkBork

1
यदि आप इस तरह का जवाब नहीं देते हैं, तो मैं वर्णों के बजाय बाइट्स द्वारा स्कोर करने का सुझाव देता हूं।
डेनिस

जवाबों:


4

जावास्क्रिप्ट (ईएस 6), 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 जब तक मैं किसी तरह चूक गया या कुछ गलत समझा, मोडुलो को इस तरह से चुना गया कि यह संभवतः नहीं हो सकता - विकर्णों को छोड़कर। (13 अलग पैटर्न है कि आप की जगह का परीक्षण कर सकते हैं j=new Dateके साथ j=0करने के लिए j=12।)
Arnauld

8

सीएस-स्क्रिप्ट - 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 नहीं फेंकती है। अन्य उपाय होंगे:

  • नीचे जाँच करने से पहले यह जाँच करना कि क्या यह अंतिम पंक्ति है (कुछ और वर्ण जोड़ता है)
  • पेड़ के 'तने' में आभूषण नहीं जोड़ना (समान बाइट गिनती, लेकिन मुझे नियमों के खिलाफ लगता है)

अगर इसे बदला जाना चाहिए तो मैं इसे ओपी पर छोड़ दूंगा।

अंत में, यह मेरा पहला गोल्फ है, इसलिए किसी भी प्रतिक्रिया की सराहना की जाती है। ;)


अच्छा समाधान। ऐसा लगता है कि आपको using System;अपनी बाइट की गिनती में शामिल करने की आवश्यकता हो सकती है , क्योंकि आप इसका उपयोग नहीं कर सकते Randomया इसके Consoleबिना नहीं कर सकते । meta.codegolf.stackexchange.com/questions/10081/… 13 बाइट्स जोड़ने के लिए क्षमा करें :(
Erresen

@Erresen: लिंक के लिए धन्यवाद! जहां तक ​​मैं बता सकता हूं, यह केवल निष्पादन के लिए आवश्यक आयातों के बारे में बात करता है, और सीएस-स्क्रिप्ट के using System;लिए आवश्यक नहीं है (यह स्वचालित रूप से सामान्य नामस्थान आयात करता है)। लेकिन शायद मैं बालों को विभाजित कर रहा हूं। ¯_ (¯) _ / ¯
अमूलवेयर

कौन जानता है! मैंने केवल दूसरे दिन ही खेलना शुरू किया। अपना उत्तर देखने से पहले cs स्क्रिप्ट के बारे में नहीं जानते थे। गोल्फ में कुछ सी # नुकसान से बचने के लिए वास्तव में उपयोगी है। जो भी जवाब हो, मुझे नहीं लगता कि एसी # स्क्रिप्ट जल्द ही किसी भी समय जीतने वाली है।
इरसेन

इतना ही निश्चित है, हाँ। : D
amulware २४'१६

यदि आप किसी फ़ंक्शन को संकलित करते हैं, यदि संभव हो तो CS-Script में, आप बाइट की संख्या कम कर सकते हैं_=>{var c=... return c;}
TheLethalCoder

4

TSQL, 556 532 494 476 बाइट्स

इस स्क्रिप्ट को मास्टर डेटाबेस पर निष्पादित करने की आवश्यकता है

golfed:

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

पायथन 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'*...इसे एक बेहतर पुनरावर्ती कार्य में बदल दिया जाए तो बहुत सारे बाइट्स काटे जा सकते हैं।

इसे यहाँ आज़माएँ

संपादित करें :

;1 बाइट के रूप में न्यूलाइन बाइट काउंट लेकर सीमांकक और कई बाइट्स के रूप में उपयोग करके 2 बाइट्स की बचत की।


1

जावास्क्रिप्ट, 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 बाइट के रूप में क्यों गिन रहे हैं ?
डैनियल शिलकॉक

अब और नहीं, खेद
वाशिंगटन Guedes

1

पीएचपी, 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}})}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.