Już prawie święta!

14

Z tego powodu rodziny z całego świata budują choinki.

Ale to normalne drzewo może po chwili stać się nudne, więc stwórzmy drzewo ASCII!

Liście są reprezentowane przez #i muszą być ułożone, jak pokazano na przykładowym wyjściu. Mamy 5 kulek ( O) i 5 cukierków ( J), które losowo umieszczamy wokół drzewa. Na górze mamy też świeczkę.

Wejście: brak

Wynik:

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

Reguły (jeśli nie ma tego w regulaminie, załóż, że możesz)

  • Kulki i laski z cukierkami muszą być losowo umieszczane na drzewie i muszą mieć co najmniej jeden liść między nimi, nie licząc przekątnych.

  • Każdy liść musi mieć niezerową szansę na zdobycie piłki lub trzciny cukrowej.

  • Na każdej linii mogą znajdować się spacje wiodące lub końcowe, o ile drzewo ma odpowiedni kształt.

  • To jest , więc wygrywa najkrótszy kod w postaci.

Szary
źródło
2
@Billywob jest blisko, ten ma losowy współczynnik i świecę: P
Grey
1
Tak, to z pewnością trudniejsze imo.
Billywob,
3
„Ale to normalne drzewo po pewnym czasie może się znudzić.” Dlaczego więc świeca ze starej szkoły, a nie coś kreatywnego ?
manatwork
1
Ponieważ nikt inny o tym nie wspominał, zalecam publikowanie przyszłych wyzwań w piaskownicy, gdzie można uzyskać znaczące informacje zwrotne i ulepszyć wyzwania, zanim opublikujesz je w Main.
AdmBorkBork,
1
Jeśli nie odpowie, które wyglądają jak to sugeruję punktacji przez bajtów zamiast znaków.
Dennis

Odpowiedzi:

4

JavaScript (ES6), 148 bajtów

Mamy nadzieję, że powinno to być zgodne z warunkiem „losowości”.

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

Próbny

Arnauld
źródło
Przetestowałem i dostałem drzewo, które pęka i musi mieć między sobą co najmniej jeden liść (#), nie licząc przekątnych ”
2216
@ user2216 O ile w jakiś sposób coś nie przeoczyłem lub nie zrozumiałem, moduł został wybrany w taki sposób, aby nie mogło się to wydarzyć - z wyjątkiem wzdłuż przekątnych. (Istnieje 13 różnych wzorów, które można przetestować, zastępując j=new Dateje j=0na j=12.)
Arnauld,
8

Skrypt CS - 306 bajtów

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

Jeszcze raz z formatowaniem i komentarzami:

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

Jest to w zasadzie C #, ale użycie CS-Script pozwala mi pominąć całą płytę kotła.

Wypróbuj tutaj!

Uwagi:

To obecnie generuje kolejną linię białych spacji pod drzewem, aby upewnić się, że „sprawdzanie istniejących ozdób poniżej” nie zgłasza wyjątku IndexOutOfBoundsException. Inne rozwiązania to:

  • Sprawdzanie, czy jest to ostatni wiersz przed sprawdzeniem poniżej (dodaje kilka dodatkowych znaków)
  • Nie dodawanie ozdób do „łodygi” drzewa (ta sama liczba bajtów, ale wydaje mi się, że jest niezgodna z regułami)

Zostawię to OP, jeśli należy to zmienić.

Wreszcie jest to mój pierwszy golf, więc wszelkie uwagi są mile widziane. ;)

amulware
źródło
Niezłe rozwiązanie. Uważa jednak, że może być konieczne uwzględnienie using System;w liczbie bajtów, ponieważ nie można go używać Randomlub Consolebez niego. meta.codegolf.stackexchange.com/questions/10081/... Przepraszam, że dodałem 13 bajtów :(
Erresen,
@Erresen: Dzięki za link! O ile wiem, mówi tylko o importach niezbędnych do wykonania, a dla cs-script using System;nie jest potrzebny (automatycznie importuje wspólne przestrzenie nazw). Ale może dzielę włosy. ¯_ (ツ) _ / ¯
amulware
kto wie! Sam zacząłem grać innego dnia. Nie wiedziałem o skrypcie cs przed zobaczeniem twojej odpowiedzi. Jest to bardzo przydatne w celu uniknięcia pewnych wad C # podczas gry w golfa. Jakakolwiek jest odpowiedź, nie sądzę, że skrypt ac # wygra w najbliższym czasie.
Erresen,
To jest pewne, tak. : D
amulware
Jeśli kompilujesz się do funkcji, jeśli to możliwe w CS-Script, możesz zmniejszyć liczbę bajtów, tj._=>{var c=... return c;}
TheLethalCoder
4

TSQL, 556 532 494 476 bajtów

Ten skrypt należy wykonać w głównej bazie danych

Gra w golfa:

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 @

Nie golfowany:

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 @

Wypróbuj to

t-clausen.dk
źródło
1

Python 3 - 450 427 bajtów

Wiem, że 450to za dużo dla Pythona. Ale ale.....

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

Jeśli zmieniona for i in'O'*...zostanie w lepszą funkcję rekurencyjną, wówczas można zmniejszyć wiele bajtów.

Wypróbuj tutaj

Edytuj :

Zaoszczędzono 2 bajty, używając ;jako separatora, i kilka bajtów, przyjmując bajt nowej linii jako 1 bajt.

Gurupad Mamadapur
źródło
1

JavaScript, 204 bajty

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
źródło
1
dlaczego liczysz \njako 1 bajt?
Daniel Shillcock,
Już nie, przepraszam
Washington Guedes,
1

PHP, 200 bajtów

może być krótszy z bardziej wyrafinowanym podejściem; ale spieszy mi się.

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;

wymaga PHP 5.6 lub 7.0. Uruchom -nrlub wypróbuj online .

Tytus
źródło
0

Scala, 329 bajtów

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}})}
Minimalny
źródło