C'est bientôt Noël!

14

Pour cette raison, des familles du monde entier construisent des arbres de Noël.

Mais cet arbre normal peut devenir ennuyeux après un certain temps, alors faisons un arbre ASCII!

Les feuilles sont représentées par #et doivent être organisées comme indiqué dans l'exemple de sortie. Nous avons 5 boules ( O) et 5 cannes de bonbon ( J), que nous plaçons au hasard autour de l'arbre. Nous avons également une bougie sur le dessus.

Entrée: aucune

Production:

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

Règles (si ce n'est pas dans les règles, supposez que vous le pouvez)

  • Les boules et les cannes de bonbon doivent être placées au hasard sur l'arbre et doivent avoir au moins une feuille entre elles, sans compter les diagonales.

  • Chaque feuille doit avoir une chance non nulle d'obtenir une balle ou une canne en bonbon.

  • Il peut y avoir des espaces de début ou de fin sur chaque ligne, tant que l'arbre a la forme appropriée.

  • C'est le , donc le code le plus court en caractères gagne.

Gris
la source
2
@Billywob c'est proche, celui-ci a un facteur aléatoire et une bougie: P
Gray
1
Oui, c'est certainement l'imo plus difficile.
Billywob
3
"Mais cet arbre normal peut devenir ennuyeux après un certain temps." Alors pourquoi la bougie old school et pas quelque chose de créatif ?
manatwork
1
Comme personne d'autre ne l'a mentionné, je vous recommande de publier les futurs défis dans le bac à sable où vous pourrez obtenir des commentaires significatifs et modifier les défis avant de les publier sur Main.
AdmBorkBork
1
Si vous ne répondez pas à cela , je vous suggère de marquer par octets plutôt que par caractères.
Dennis

Réponses:

4

JavaScript (ES6), 148 octets

Espérons que cela devrait respecter la condition «assez aléatoire».

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

Démo

Arnauld
la source
J'ai testé et j'ai un arbre qui se brise 'et doit avoir au moins une feuille (#) entre eux, sans compter les diagonales'
user2216
@ user2216 À moins que j'aie manqué ou mal compris quelque chose, le modulo a été choisi de telle manière que cela ne puisse pas arriver, sauf le long des diagonales. (Il y a 13 modèles distincts que vous pouvez tester en remplaçant j=new Datepar j=0to j=12.)
Arnauld
8

CS-Script - 306 octets

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

Encore une fois avec mise en forme et commentaires:

// 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'est essentiellement C #, mais l'utilisation de CS-Script me permet de sauter toute la plaque chauffante.

Essayez-le ici!

Remarques:

Cela génère actuellement une autre ligne d'espaces blancs sous l'arborescence pour vous assurer que la «vérification des ornements existants ci-dessous» ne lève pas une exception IndexOutOfBoundsException. D'autres solutions seraient:

  • Vérifier s'il s'agit de la dernière ligne avant de vérifier ci-dessous (ajoute quelques caractères supplémentaires)
  • Ne pas ajouter d'ornements à la «tige» de l'arbre (même nombre d'octets, mais il me semble contraire aux règles)

Je laisse le soin au PO si cela devait être changé.

Enfin, c'est mon premier golf, donc tout commentaire est apprécié. ;)

amulware
la source
Belle solution. Il pense que vous devrez peut-être inclure using System;dans votre nombre d'octets, car vous ne pouvez pas l'utiliser Randomou Consolesans. meta.codegolf.stackexchange.com/questions/10081/… Désolé d'ajouter 13 octets :(
Erresen
@Erresen: Merci pour le lien! Pour autant que je sache, il ne parle que des importations nécessaires à l'exécution, et pour cs-script using System;n'est pas nécessaire (il importe automatiquement les espaces de noms communs). Mais peut-être que je divise les cheveux. ¯_ (ツ) _ / ¯
amulware
qui sait! J'ai seulement commencé à jouer l'autre jour moi-même. Je ne connaissais pas le script cs avant d'avoir vu votre réponse. Vraiment utile pour éviter certains inconvénients C # au golf. Quelle que soit la réponse, je ne pense pas que le script ac # va gagner de sitôt.
Erresen
C'est certain, oui. : D
amulware
Si vous compilez vers une fonction, si possible dans CS-Script, vous pouvez réduire le nombre d'octets, c'est_=>{var c=... return c;}
TheLethalCoder
4

TSQL, 556 532 494 476 octets

Ce script doit être exécuté sur la base de données master

Golfé:

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 @

Non golfé:

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 @

Essaye le

t-clausen.dk
la source
1

Python 3 - 450 427 octets

Je sais que 450c'est trop pour python. Mais mais.....

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

Si le for i in'O'*...est transformé en une meilleure fonction récursive, de nombreux octets peuvent être réduits.

Essayez-le ici

Éditer :

Enregistré 2 octets en utilisant ;comme délimiteur et plusieurs octets en prenant le nombre d'octets de nouvelle ligne comme 1 octet.

Gurupad Mamadapur
la source
1

JavaScript, 204 octets

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
la source
1
pourquoi comptez-vous \ncomme 1 octet?
Daniel Shillcock
Plus maintenant, désolé
Washington Guedes
1

PHP, 200 octets

pourrait être plus courte avec une approche plus sophistiquée; mais je suis pressé.

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;

nécessite PHP 5.6 ou 7.0. Courez avec -nrou essayez-le en ligne .

Titus
la source
0

Scala, 329 octets

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
la source