Neredeyse Noel!


14

Bu nedenle, dünyanın her yerinden aileler Noel ağaçları inşa ediyorlar.

Ama bu normal ağaç bir süre sonra sıkıcı olabilir, bu yüzden bir ASCII ağacı yapalım!

Yapraklar temsil edilir #ve örnek çıktısında gösterildiği gibi düzenlenmelidir. Ağacın etrafına rastgele yerleştirdiğimiz 5 top ( O) ve 5 şeker kamışı ( J) var. Üstünde bir de mum var.

Giriş: hiçbiri

Çıktı:

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

Kurallar (kurallarda değilse, yapabileceğinizi varsayalım)

  • Toplar ve şekerler ağaca rastgele yerleştirilmeli ve aralarında en az bir yaprak olmalı, köşegenler sayılmamalıdır.

  • Her yaprağın, top veya şeker kamışı alma şansı sıfırdan farklı olmalıdır.

  • Ağaç uygun şekle sahip olduğu sürece her bir çizgide ön veya arka boşluklar olabilir.

  • Bu , bu yüzden karakterlerde en kısa kod kazanır.


2
@Billywob yakın bir tane, bu rasgele bir faktöre ve bir muma sahip: P
Gri

1
Evet, bu kesinlikle daha zor imo.
Billywob

3
“Ama bu normal ağaç bir süre sonra sıkıcı olabilir.” Öyleyse neden eski bir okul mumu ve yaratıcı bir şey değil ?
manatwork

1
Başka hiç kimseden bahsetmediği için, Sandbox'a gelecekteki zorlukları göndermenizi tavsiye edeceğim, burada önemli geri bildirim alabileceğiniz ve Main'e göndermeden önce zorlukları ayarlayabileceksiniz.
AdmBorkBork

1
Eğer gibi bu bakışı cevaplar yoksa bu , ben bayt yerine karakterlerin puanlama düşündürmektedir.
Dennis

Yanıtlar:


4

JavaScript (ES6), 148 bayt

Umarım, bu 'yeterince rasgele' koşula uymalıdır.

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

gösteri


Ben test ve kırdı bir ağaç var 've aralarında en az bir yaprak (#) olmalı, çapraz sayma değil'
user2216

@ user2216 Bir şekilde bir şeyi kaçırmadıkça veya yanlış anlamadıysam, modulo, çaprazlama hariç, gerçekleşmeyecek şekilde seçildi. (13 farklı yapıyı değiştirmekte tarafından test edebilirsiniz vardır j=new Dateile j=0karşı j=12.)
Arnauld

8

CS-Script - 306 bayt

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

Biçimlendirme ve yorumlarla bir kez daha:

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

Temelde C #, ancak CS-Script kullanmak tüm kazan plakasını atlamama izin veriyor.

Burada deneyin!

Notlar:

Bu, şu anda ağacın altındaki başka bir beyaz boşluk satırı çıkartarak 'aşağıdaki süs eşyaları kontrol etmenin' bir IndexOutOfBoundsException oluşturmadığından emin olun. Diğer çözümler:

  • Aşağıda kontrol etmeden önce son satır olup olmadığını kontrol etme (birkaç karakter daha ekler)
  • Ağacın 'gövdesine' süsler eklememek (Aynı bayt sayısı, ancak kurallara aykırı olduğumu düşünüyorum)

Değiştirilmesi gerekiyorsa OP'ye bırakacağım.

Son olarak, bu benim ilk golf, bu yüzden herhangi bir geri bildirim takdir. ;)


Güzel çözüm. Yine using System;de kullanamayacağınız Randomya da Consoleonsuz bayt sayınıza dahil etmeniz gerekebilir . meta.codegolf.stackexchange.com/questions/10081/… 13 bayt eklediğim için üzgünüm :(
Erresen

@Erresen: Bağlantı için teşekkürler! Anlayabildiğim kadarıyla, sadece yürütme için gerekli olan ithalattan bahsediyor ve cs-script using System;için gerekli değil (otomatik olarak ortak ad alanlarını içeri aktarıyor). Ama belki saçları bölüyorum. ¯_ (ツ) _ / ¯
amulware

kim bilir! Sadece geçen gün oynamaya başladım. Cevabınızı görmeden cs betiğini bilmiyordum. Golf bazı C # dezavantajları önlemek için gerçekten yararlı. Cevap ne olursa olsun, ac # script'in yakında kazanacağını sanmıyorum.
Erresen

Bu çok kesin, evet. : D
amulware

Bir işleve _=>{var c=... return c;}
derlerseniz

4

TSQL, 556 532 494 476 bayt

Bu komut dosyasının ana veritabanında yürütülmesi gerekir

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 @

Denemek


1

Python 3 - , 450 427 bayt

450Python için çok fazla olduğunu biliyorum . Ama ama.....

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

Eğer daha iyi bir özyinelemeli işlevefor i in'O'*... dönüştürülürse, çok sayıda bayt kesilebilir.

Burada deneyin

Düzenle :

;Sınırlayıcı olarak 2 bayt ve satırsonu sayısını 1 bayt olarak alarak birkaç bayt kaydedildi.


1

JavaScript, 204 bayt

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
neden \n1 bayt sayıyorsunuz ?
Daniel Shillcock

Artık değil, üzgünüm
Washington Guedes

1

PHP, 200 bayt

daha sofistike bir yaklaşımla daha kısa olabilir; ama acelem var.

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 veya 7.0 gerektirir. Birlikte çalışın-nr veya çevrimiçi deneyin .


0

Scala, 329 bayt

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}})}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.