È quasi Natale!


14

Per questo motivo, le famiglie di tutto il mondo stanno costruendo alberi di Natale.

Ma questo albero normale può diventare noioso dopo un po ', quindi facciamo un albero ASCII!

Le foglie sono rappresentate da #e devono essere disposte come mostrato nell'output di esempio. Abbiamo 5 palline ( O) e 5 bastoncini di zucchero ( J), che posizioniamo casualmente attorno all'albero. Abbiamo anche una candela in cima.

Input: nessuno

Produzione:

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

Regole (se non è nelle regole, supponi di poterlo fare)

  • Palle e bastoncini di zucchero devono essere posizionati casualmente sull'albero e devono avere almeno una foglia tra loro, senza contare le diagonali.

  • Ogni foglia deve avere una probabilità diversa da zero di ottenere una palla o un bastoncino di zucchero.

  • Potrebbero esserci spazi iniziali o finali su ciascuna linea, purché l'albero abbia la forma corretta.

  • Questo è , quindi vince il codice più breve in caratteri.


2
@Billywob è vicino, questo ha un fattore randomizzato e una candela tho: P
Grey

1
Sì, questo è sicuramente più difficile imo.
Billywob,

3
"Ma questo albero normale può diventare noioso dopo un po '." Allora perché la candela della vecchia scuola e non qualcosa di creativo ?
arte

1
Dal momento che nessun altro ha menzionato, ti consiglio di pubblicare sfide future su Sandbox in cui puoi ottenere un feedback significativo e modificare le sfide prima di pubblicarle su Main.
AdmBorkBork,

1
Se non rispondi in questo modo , ti suggerisco di assegnare un punteggio per byte anziché per caratteri.
Dennis,

Risposte:


4

JavaScript (ES6), 148 byte

Si spera che ciò dovrebbe rispettare la condizione "abbastanza casuale".

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

dimostrazione


Ho provato e ho un albero che si spezza "e deve avere almeno una foglia (#) tra di loro, senza contare le diagonali"
user2216

@ user2216 A meno che in qualche modo mi sia sfuggito o frainteso qualcosa, il modulo è stato scelto in modo tale da non poter accadere, tranne che lungo le diagonali. (Esistono 13 modelli distinti che è possibile verificare sostituendo j=new Datecon j=0a j=12.)
Arnauld

8

Script CS - 306 byte

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

Ancora una volta con formattazione e commenti:

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

Fondamentalmente è C #, ma l'uso di CS-Script mi permette di saltare tutta la piastra della caldaia.

Provalo qui!

Appunti:

Questo attualmente genera un'altra linea di spazi bianchi sotto l'albero per assicurarsi che il "controllo degli ornamenti esistenti sotto" non generi IndexOutOfBoundsException. Altre soluzioni sarebbero:

  • Verifica se è l'ultima riga prima di controllare di seguito (aggiunge qualche altro carattere)
  • Non aggiungere ornamenti allo 'stelo' dell'albero (Stesso numero di byte, ma mi sembra contrario alle regole)

Lascerò all'OP se questo dovesse essere cambiato.

Infine, questo è il mio primo golf, quindi ogni feedback è apprezzato. ;)


Bella soluzione. using System;Tuttavia, potrebbe essere necessario includere nel conteggio dei byte, poiché non è possibile utilizzarlo Randomo Consolemeno. meta.codegolf.stackexchange.com/questions/10081/… Siamo spiacenti di aggiungere 13 byte :(
Erresen,

@Erresen: grazie per il link! Per quanto posso dire, parla solo delle importazioni necessarie per l'esecuzione, e per cs-script using System;non è necessario (importa automaticamente spazi dei nomi comuni). Ma forse sto spaccando i capelli. ¯_ (ツ) _ / ¯
amulware

chissà! Ho iniziato a suonare solo l'altro giorno da solo. Non sapevo dello script cs prima di vedere la tua risposta. Davvero utile per evitare alcuni svantaggi di C # nel golf. Qualunque sia la risposta, non credo che ac # script vincerà presto.
Erresen,

Questo è certo, sì. : D
amulware,

Se si compila in una funzione, se possibile in CS-Script, è possibile ridurre il conteggio dei byte, ad esempio_=>{var c=... return c;}
TheLethalCoder

4

TSQL, 556 532 494 476 byte

Questo script deve essere eseguito sul database principale

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 @

Provalo


1

Python 3 - 450 427 byte

So che 450è troppo per Python. Ma ma.....

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

Se for i in'O'*...si trasforma in una migliore funzione ricorsiva, è possibile ridurre molti byte.

Provalo qui

Modifica :

Salvato 2 byte usando ;come delimitatore e diversi byte prendendo il conteggio di newline byte come 1 byte.


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}


1
perché stai contando \ncome 1 byte?
Daniel Shillcock,

Non più, scusa
Washington Guedes,

1

PHP, 200 byte

potrebbe essere più breve con un approccio più sofisticato; ma ho fretta.

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;

richiede PHP 5.6 o 7.0. Corri con -nro provalo online .


0

Scala, 329 byte

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}})}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.