Rosną kwiaty!

11

Niedawno nadeszła wiosna i jest to prawie czas, kiedy kwiaty zaczynają kiełkować. Więc chcę, żebyś pomógł im się rozwijać.

Twoje zadanie:

Biorąc pod uwagę dwie liczby mi kwiaty nwyjściowe mlosowo umieszczone na n*nsiatce.

Pojedynczy kwiat wygląda następująco:

&
|

Pozycja kwiatu jest określona przez jego położenie &. Podczas losowego umieszczania dwóch kwiatów żadne dwa nie mogą znajdować się w tym samym miejscu. Jeśli jeden kwiat &nakłada się na inny kwiat |, wyświetl &. Dolny rząd kwiatów może nie zawierać żadnych &.

Dane wejściowe mogą być liczbą lub ciągiem znaków za pomocą dowolnej standardowej metody.

Wyjściem może być lista ciągów, każdy ciąg reprezentujący jeden wiersz siatki lub ciąg rozdzielany według tych samych wytycznych co lista. Standardowe metody produkcji. Dozwolone są końcowe wieloryby, a do rozdzielania kwiatów można używać zakładek. Pamiętaj, że każda siatka musi być całkowicie wypełniona spacjami lub czymś podobnym.

Pamiętaj, że dane wejściowe będą zawsze prawidłowe, zawsze będziesz mógł legalnie dopasować mkwiaty do siatki nwedług n.

Przypadki testowe:

Ponieważ ze względu na cały bit „losowego umieszczenia” można zagwarantować tylko bardzo wąskie przypadki testowe, będzie to jedyny rodzaj przypadku testowego z udzieloną odpowiedzią. Spróbuję jednak przesłać wszystkie zgłoszenia online, aby upewnić się, że są one prawidłowe, korzystając z niektórych przypadków testowych.

Dane wejściowe dla przypadków testowych podano w formularzu m, n.

Input: 2, 2
Output:

&&
||
--------------
Input: 6, 3
Output:

&&&
&&&
|||

Zauważ, że nowa linia po słowie Output:w przypadkach testowych jest opcjonalna.

Inne przypadki testowe:

  1. 1, 10
  2. 0, 100
  3. 5, 8
  4. 6, 3

Code golf, więc najkrótszy kod wygrywa!

Dziękujemy ComradeSparklePony za podjęcie tego wyzwania i umieszczenie go w pudełku prezentowym Sekretnego Świętego Mikołaja! Post w piaskownicy

Krzysztof
źródło
2
Kiedy mówisz „losowo”, czy każdy możliwy wynik musi mieć jednakowe prawdopodobieństwo?
xnor

Odpowiedzi:

5

Galaretka , 33 bajty

²‘;⁹R¤ṬṖs⁸×’¤Ẋ€ṙ2B¤F€ZḄị“&|& ”s⁸Y

Wypróbuj online!

W jaki sposób?

²‘;⁹R¤ṬṖs⁸×’¤Ẋ€ṙ2B¤F€ZḄị“&|& ”s⁸Y - Main link: n, m        e.g. 3, 2
²                                 - square n                    9
 ‘                                - increment                   10
     ¤                            - nilad followed by link(s) as a nilad:
   ⁹                              -     link's right argument   2
    R                             -     range                   [1,2]
  ;                               - concatenate                 [10,1,2]
      Ṭ                           - untruth (1s at indexes)     [1,1,0,0,0,0,0,0,0,1]
       Ṗ                          - pop                         [1,1,0,0,0,0,0,0,0]
            ¤                     - nilad followed by link(s) as a nilad:
         ⁸                        -     link's left argument    3
           ’                      -     decrement               2
          ×                       -     multiply                6
        s                         - split into chunks           [[1,1,0,0,0,0],[0,0,0]]
             Ẋ€                   - shuffle €ach       (maybe:) [[0,1,0,0,1,0],[0,0,0]]
                  ¤               - nilad followed by link(s) as a nilad:
                2B                -     2 in binary             [1,0]
               ṙ                  - rotate (vectorises)         [[[0,0,0],[0,1,0,0,1,0]],[[0,1,0,0,1,0],[0,0,0]]]
                   F€             - flatten €ach                [[0,0,0,0,1,0,0,1,0],[0,1,0,0,1,0,0,0,0]]
                     Z            - transpose                   [[0,0],[0,1],[0,0],[0,0],[1,1],[0,0],[0,0],[1,0],[0,0]]
                      Ḅ           - from binary (vectorises)    [0,1,0,0,3,0,0,2,0]
                        “&|& ”    - literal                     ['&','|','&',' ']
                       ị          - index into                  [' ','&',' ',' ','&',' ',' ','|',' ']
                               ⁸  - link's left argument        3
                              s   - split into chunks           [[' ','&',' '],[' ','&',' '],[' ','|',' ']]
                                Y - join with newlines          [' ','&',' ','\n',' ','&',' ','\n',' ','|',' ']
                                  - implicit print
Jonathan Allan
źródło
Mój umysł został wysadzony w powietrze
Christopher
Czy zamieniłeś znaczenia mi ndlaczego square m? wth jest niladem ?
Tytus
Czy te 33 znaki to tak naprawdę tylko 33 bajty?
Tytus
1
@Titus Nie zamieniłem znaczeń, zamieniłem kolejność wprowadzania danych (i tym samym pomieszałem wyjaśnienie), więc dzięki za złapanie tego. Nilad (w przeciwieństwie do monady lub diady lub ...) to funkcja, która nie przyjmuje danych wejściowych i zwraca wartość - jako taka stała jest niladem, podobnie jak pojedyncze wejście funkcji lub programu. To tak naprawdę 33 różne bajty - znaki są po prostu kodowaniem 256 bajtów używanych przez Jelly, do których są powiązane bajty słów w nagłówku.
Jonathan Allan
Prawie mnie zgubiłeś rotate. Dobra robota; świetny podział!
Tytus
4

PHP (> = 7,1), 135 131 128 116 110 109 bajtów

for([,$m,$n]=$argv,$z=$q=$n*$n;$q;)echo" |&"[$m&&rand(0,--$z-$n)<$m?$s[$q]=2+!$m--:$s[$q+$n]/2],"
"[--$q%$n];

pobiera dane wejściowe z argumentów wiersza poleceń; uruchom go -nrlub przetestuj online .

awaria

for([,$m,$n]=$argv,     # import arguments
    $z=$q=$n*$n;        # $q = number of total fields, $z-$n = available for flowers
    $q;                 # loop $q down to 0
)   
    echo" |&"[              # print:
        $m&&rand(0,--$z-$n)<$m  # if (probability $m/($z-$n)), decrement $z
            ?$s[$q]=2+!$m--     # then index 2 (flower), set $s[$q], decrement $m
            :$s[$q+$n]/2        # else if flower above, then 1 (stalk), else 0 (space)
        ],
        "\n"[--$q%$n]           # print newline every $n characters
    ;
Tytus
źródło
1
Dodałeś bajty dla flagi, prawda?
Christopher
@Christopher -rjest bezpłatny ; nakazuje PHP uruchomienie kodu z argumentu wiersza poleceń. -nresetuje PHP do ustawień domyślnych.
Tytus
1
@JonathanAllan Ustawiona wersja wydaje się zależeć od twojej poprzedniej wizyty; prawdopodobnie ciasteczko.
Tytus
3

Python 2 , 150 bajtów

from random import*
n,m=input()
b=[1]*m+[0]*(n*~-n-m)
shuffle(b)
for r in range(n):print''.join(' &|'[f^-s]for s,f in zip([0]*n+b,b+[0]*n)[r*n:r*n+n])

Wypróbuj online!

W jaki sposób?

Pobiera input()ze STDIN i rozpakowuje dostarczoną krotkę (ciąg liczb dziesiętnych oddzielonych przecinkami jak 3,6) do ni m.

Tworzy uporządkowany, jednowymiarowy n*(n-1)długi „kwietnik”, błącząc:
- listę zawierającą „kwiat” [1]powtarzane mrazy; oraz
- listę zawierającą „spację” [0]powtarzającą się n*~-n-mrazy *.

* Operator kijanki ~( ~x=-1-x) oszczędza 2 bajty n*~-n-mzamiast bardziej normalnego wyglądu n*(n-1)-m.

Shuffle (używając random„s shufflefunkcję) ten kwietnik umieścić kwiaty i przestrzenie losowo pomiędzy n*(n-1)pozycjami.

Przechodzi przez rzędy 0-indeksowane ri printskażdy z kolei tworzy dwuwymiarowy kwietnik z jednowymiarowego ...

Ostatni dwuwymiarowy ( n*n) kwietnik ma łodygi, sjeden rząd poniżej główek kwiatów f, jeśli i tylko wtedy, gdy nie ma głowy do pokazania. Osiąga się to przez XORing ( ^) fz -sgdzie fi s1si 0si przed i wykorzystując wynik do indeksowania do łańcucha długości 3 ' &|':

f   s   f^-s   ' &|'[f^-s]
0   0    0     ' '
0   1   -1     '|'  < negative indexing used here
1   0    1     '&'
1   1   -2     '&'  < ...and here.

Aby uzyskać fi funkcja jest używana z dwoma kopiami jednego kwietnik wymiarowej, po jednym z pomieszczeń tylną (szefów kwiat) i jednym z czołowych miejsc (łodygi). Cała rzecz jest tworzona dla każdego wiersza (w celu zapisania bajtów), a wymagany wiersz jest wycinany za pomocą .szipnn[r*n:r*n+n]

Jonathan Allan
źródło
2

Python 2 , 184 179 bajtów

from random import*
m,n=input()
s,a=' &'
l=[s]*n*-~n
while s.count(a)<m:x=randrange(n*n-n);l[x]=a;l[x+n]='|&'[l[x+n]==a];s='\n'.join(''.join(l[i*n:][:n])for i in range(n))
print s

Wypróbuj online!

ovs
źródło
2

Python 2 , 129 bajtów

from random import*
n,m=input();d=n*n-n
s=''
while d+n:b=0<random()*d<m;m-=b;d-=1;s+=' |&'[-b|(s[~n:-n]=='&')]+'\n'[d%n:]
print s

Wypróbuj online!

Generuje ciąg wyjściowy po jednym znaku na raz. Losowo wybiera, czy bieżąca komórka jest kwiatem z prawdopodobieństwem równym liczbie mpozostałych kwiatów podzielonej przez liczbę pozostałych spacji. Dodaje nową linię do każdego nznaku. Pusta komórka jest wypełniona trzonem, |jeśli symbolem nod końca jest a &.

xnor
źródło
1

PHP, 111 bajtów

for([,$b,$s]=$argv;$i<$s**2;)echo${+$i}="| &"[(rand(1,$s**2-$s-$i)>$b?0:$b--)>0?2:${$i-$s}!="&"],"\n"[++$i%$s];

Wersja online

-1 bajt dla fizycznej nowej linii

rozwiązanie 115 bajtów przy użyciu max

for([,$b,$s]=$argv;$i<$s**2;)echo${+$i}="&| "[rand(1,max($s**2-$s-$i,1))>$b?1+(${$i-$s}!="&"):!$b--],"\n"[++$i%$s];

W ten sposób 137 bajtów tasuje pierwszą część łańcucha

for([,$b,$s]=$argv,$a=str_shuffle(($p=str_pad)($p("",$b,_),$s**2-$s));$i<$s**2;)echo$a[$i]<_?" |"[$a[$i-$s]==_&$i>=$s]:"&","\n"[++$i%$s];
Jörg Hülsermann
źródło
1

JavaScript (ES6), 157 bajtów

f=(n,m,a=[...(` `.repeat(n)+`
`).repeat(n)],r=Math.random()*-~n*~-n|0)=>m?(a[r]==` `?a[m--,r]=`&`:0,f(n,m,a)):a.map((c,i)=>c==` `&&a[i+~n]==`&`?`|`:c).join``
<div oninput=o.textContent=f(n.value,m.value)><input id=n type=number min=2 value=2><input id=m type=number min=1><pre id=o>

Objaśnienie: Tworzy tablicę reprezentującą siatkę kwiatów plus nowe linie. Rekurencyjnie losowo wyszukuje puste kwadraty, w których należy umieścić kwiaty, aż do osiągnięcia żądanej liczby kwiatów. Wreszcie łodygi kwiatów są generowane tam, gdzie jest dla nich miejsce.

Neil
źródło
Z jakiegoś powodu powoduje to błąd, gdy n = 2 im = 3.
Kudłaty
@Shaggy To dlatego, że jest tylko miejsce na 2 kwiaty.
Neil
Ach, czytałem to w niewłaściwy sposób. Przeprosiny.
Kudłaty
1

Węgiel drzewny , 27 bajtów

Nθ↷FN«J‽θ‽⊖θW⁼KK&J‽θ‽⊖θ&¬KK

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Nθ

Wejście n.

Zmień domyślny kierunek drukowania na w dół.

FN«

Wejdź mi zapętl to tyle razy.

J‽θ‽⊖θ

Przejdź do losowej lokalizacji na siatce.

W⁼KK&J‽θ‽⊖θ

Jeśli jest już kwiatek, skacz w losowe miejsca, aż znajdziesz odpowiednie miejsce.

&

Wydrukuj główkę kwiatu.

¬KK

Wydrukuj łodygę, jeśli poniżej nie ma jeszcze główki kwiatowej.

Neil
źródło