¡Es casi Navidad!

14

Debido a esto, familias de todo el mundo están construyendo árboles de Navidad.

Pero este árbol normal puede volverse aburrido después de un tiempo, ¡así que hagamos un árbol ASCII!

Las hojas están representadas por #y deben organizarse como se muestra en la salida de ejemplo. Tenemos 5 bolas ( O) y 5 bastones de caramelo ( J), que colocamos al azar alrededor del árbol. También tenemos una vela en la parte superior.

Entrada: ninguna

Salida:

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

Reglas (si no está en las reglas, suponga que puede)

  • Las bolas y los bastones de caramelo deben colocarse al azar en el árbol y deben tener al menos una hoja entre ellos, sin contar las diagonales.

  • Cada hoja debe tener una probabilidad distinta de cero de obtener una bola o un bastón de caramelo.

  • Puede haber espacios iniciales o finales en cada línea, siempre que el árbol tenga la forma adecuada.

  • Este es el , por lo que gana el código más corto en caracteres.

Gris
fuente
2
@Billywob está cerca, este tiene un factor aleatorio y una vela aunque: P
Gris
1
Sí, esto es ciertamente más difícil de la OMI.
Billywob
3
"Pero este árbol normal puede volverse aburrido después de un tiempo". Entonces, ¿por qué la vela de la vieja escuela y no algo creativo ?
manatwork
1
Como nadie más lo ha mencionado, le recomendaré que publique futuros desafíos en el Sandbox donde puede obtener comentarios significativos y ajustar los desafíos antes de publicarlos en Main.
AdmBorkBork
1
Si no contesta que se parecen a esto , sugiero anotar por bytes en lugar de caracteres.
Dennis

Respuestas:

4

JavaScript (ES6), 148 bytes

Con suerte, esto debería cumplir con la condición de "lo suficientemente aleatorio".

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

Manifestación

Arnauld
fuente
Probé y obtuve un árbol que se rompe 'y debe tener al menos una hoja (#) entre ellos, sin contar las diagonales'
user2216
@ user2216 A menos que de alguna manera me perdiera o entendiera mal algo, el módulo fue elegido de tal manera que no puede suceder, excepto en las diagonales. (Hay 13 patrones distintos que puede probar reemplazando j=new Datecon j=0a 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);

Una vez más con formato y comentarios:

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

Básicamente es C #, pero usar CS-Script me permite omitir toda la placa de caldera.

Pruébalo aquí!

Notas:

En la actualidad, esto genera otra línea de espacios en blanco debajo del árbol para asegurarse de que 'verificar los adornos existentes debajo' no arroje una excepción IndexOutOfBoundsException. Otras soluciones serían:

  • Verificando si es la última línea antes de marcar a continuación (agrega algunos caracteres más)
  • No agregar adornos al 'tallo' del árbol (el mismo conteo de bytes, pero me parece estar en contra de las reglas)

Lo dejaré al OP si esto se cambia.

Por último, este es mi primer golf, por lo que cualquier comentario es apreciado. ;)

amulware
fuente
Buena solución Sin using System;embargo, cree que es posible que deba incluir en su recuento de bytes, ya que no puede usarlo Randomo Consolesin él. meta.codegolf.stackexchange.com/questions/10081/… Lamento agregar 13 bytes :(
Erresen
@Erresen: ¡Gracias por el enlace! Hasta donde puedo decir, solo habla de las importaciones necesarias para la ejecución, y para cs-script using System;no es necesario (importa automáticamente espacios de nombres comunes). Pero tal vez estoy dividiendo pelos. ¯_ (ツ) _ / ¯
amulware
¡quién sabe! Solo comencé a jugar el otro día yo mismo. No sabía sobre el script cs antes de ver su respuesta. Realmente útil para evitar algunas desventajas de C # en el golf. Cualquiera sea la respuesta, no creo que ac # script vaya a ganar pronto.
Erresen
Eso es seguro, sí. : D
amulware
Si compila una función, si es posible en CS-Script, podría reducir el recuento de bytes, es decir_=>{var c=... return c;}
TheLethalCoder
4

TSQL, 556 532 494 476 bytes

Este script debe ejecutarse en la base de datos maestra

Golfizado:

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 @

Sin 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 @

Pruébalo

t-clausen.dk
fuente
1

Python 3 - 450 427 bytes

Sé que 450es demasiado para Python. Pero pero.....

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 for i in'O'*...se convierte en una mejor función recursiva, entonces se pueden reducir muchos bytes.

Pruébalo aquí

Editar :

Se guardaron 2 bytes al usar ;como delimitador y varios bytes al tomar el recuento de bytes de nueva línea como 1 byte.

Gurupad Mamadapur
fuente
1

JavaScript, 204 bytes

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
fuente
1
¿Por qué estás contando \ncomo 1 byte?
Daniel Shillcock
Ya no, lo siento
Washington Guedes
1

PHP, 200 bytes

podría ser más corto con un enfoque más sofisticado; pero tengo prisa

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;

requiere PHP 5.6 o 7.0. Ejecutar -nro probarlo en línea .

Titus
fuente
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}})}
Mínimo
fuente