Es ist schon fast Weihnachten!

14

Aus diesem Grund bauen Familien aus aller Welt Weihnachtsbäume.

Aber dieser normale Baum kann nach einer Weile langweilig werden, also machen wir einen ASCII-Baum!

Blätter werden durch dargestellt #und müssen wie in der Beispielausgabe gezeigt angeordnet werden. Wir haben 5 Bälle ( O) und 5 Zuckerstangen ( J), die wir zufällig um den Baum legen. Wir haben auch eine Kerze oben drauf.

Eingabe: keine

Ausgabe:

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

Regeln (wenn es nicht in den Regeln steht, nimm an, dass du kannst)

  • Kugeln und Zuckerstangen müssen zufällig auf den Baum gelegt werden und mindestens ein Blatt dazwischen haben, wobei die Diagonalen nicht berücksichtigt werden.

  • Jedes Blatt muss eine Chance von ungleich Null haben, einen Ball oder eine Zuckerstange zu bekommen.

  • In jeder Zeile können sich führende oder nachfolgende Leerzeichen befinden, solange der Baum die richtige Form hat.

  • Dies ist , also gewinnt der kürzeste Code in Zeichen.

Grau
quelle
2
@ Billywob es ist eine enge, diese hat einen zufälligen Faktor und eine Kerze tho: P
Gray
1
Ja, das ist mit Sicherheit schwieriger.
Billywob
3
"Aber dieser normale Baum kann nach einer Weile langweilig werden." Warum dann die Kerze der alten Schule und nicht etwas Kreatives ?
Handarbeit
1
Da noch niemand etwas erwähnt hat, empfehle ich Ihnen, zukünftige Herausforderungen in der Sandbox zu veröffentlichen, wo Sie aussagekräftiges Feedback erhalten und Herausforderungen optimieren können, bevor Sie sie an Main senden.
AdmBorkBork
1
Wenn Sie nicht , die aussehen wie beantwortet diese , schlage ich Scoring von Bytes anstatt Zeichen.
Dennis

Antworten:

4

JavaScript (ES6), 148 Byte

Hoffentlich sollte dies der Bedingung "Zufällig genug" entsprechen.

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

Demo

Arnauld
quelle
Ich habe einen Baum getestet, der bricht und mindestens ein Blatt (#) dazwischen haben muss, ohne die Diagonalen zu zählen
user2216
@ user2216 Sofern ich etwas nicht irgendwie verpasst oder missverstanden habe, wurde das Modulo so gewählt, dass es unmöglich passieren kann - außer entlang von Diagonalen. (Es gibt 13 verschiedene Muster , dass Sie durch den Austausch testen können j=new Datemit j=0auf j=12.)
Arnauld
8

CS-Script - 306 Bytes

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

Nochmals mit Formatierung und Kommentaren:

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

Es ist im Grunde C #, aber mit CS-Script kann ich die gesamte Kesselplatte überspringen.

Probieren Sie es hier aus!

Anmerkungen:

Dadurch wird derzeit eine weitere Zeile mit Leerzeichen unterhalb des Baums ausgegeben, um sicherzustellen, dass beim Überprüfen auf vorhandene Ornamente darunter keine IndexOutOfBoundsException ausgelöst wird. Andere Lösungen wären:

  • Überprüfen Sie, ob es sich um die letzte Zeile handelt, bevor Sie sie unten überprüfen (fügt ein paar weitere Zeichen hinzu).
  • Keine Verzierungen zum 'Stamm' des Baumes hinzufügen (Gleiche Byteanzahl, scheint aber gegen die Regeln zu verstoßen)

Ich überlasse es dem OP, wenn dies geändert werden sollte.

Zum Schluss ist dies mein erstes Golfspiel, daher ist jedes Feedback willkommen. ;)

Amulware
quelle
Gute Lösung. Es wird jedoch davon ausgegangen, dass Sie möglicherweise using System;in Ihre Byteanzahl aufnehmen müssen, da Sie sie nicht verwenden können Randomoder Consolenicht. meta.codegolf.stackexchange.com/questions/10081/… Es tut uns leid, 13 Bytes hinzuzufügen :(
Erresen
@ Erresen: Danke für den Link! Soweit ich das beurteilen kann, handelt es sich jedoch nur um für die Ausführung erforderliche Importe, und für cs-script using System;wird nichts benötigt (es importiert automatisch allgemeine Namespaces). Aber vielleicht spalte ich die Haare. ¯_ (ツ) _ / ¯
Amulware
Wer weiß! Ich habe erst neulich selbst angefangen zu spielen. Ich wusste nichts über CS-Skripte, bevor ich Ihre Antwort gesehen habe. Sehr nützlich, um einige C # -Nachteile beim Golfen zu vermeiden. Was auch immer die Antwort ist, ich glaube nicht, dass ein Skript bald gewinnen wird.
Erresen
Soviel ist sicher, ja. : D
Amulware
Wenn Sie zu einer Funktion kompilieren, wenn möglich in CS-Script, können Sie die Anzahl der Bytes verringern, dh_=>{var c=... return c;}
TheLethalCoder
4

TSQL, 556 532 494 476 Bytes

Dieses Skript muss in der master-Datenbank ausgeführt werden

Golf gespielt:

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 @

Versuch es

t-clausen.dk
quelle
1

Python 3 - 450 427 Bytes

Ich weiß, es 450ist zu viel für Python. Aber aber.....

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

Wenn das for i in'O'*...in eine bessere rekursive Funktion umgewandelt wird, können viele Bytes reduziert werden.

Probieren Sie es hier aus

Bearbeiten :

2 Bytes durch Verwendung ;als Trennzeichen und mehrere Bytes durch Verwendung der Anzahl der Zeilenumbrüche als 1 Byte gespeichert.

Gurupad Mamadapur
quelle
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}

Washington Guedes
quelle
1
Warum zählen Sie \nals 1 Byte?
Daniel Shillcock
Nicht mehr, sorry
Washington Guedes
1

PHP, 200 Bytes

könnte kürzer sein mit einem ausgefeilteren Ansatz; aber ich habe es eilig

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;

benötigt PHP 5.6 oder 7.0. Laufen Sie mit -nroder versuchen Sie es online .

Titus
quelle
0

Scala, 329 Bytes

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}})}
Minimal
quelle