Tumbuhkan Beberapa Bunga!

11

Musim semi baru-baru ini tiba, dan hampir tiba saatnya bunga mulai tumbuh. Jadi saya ingin Anda membantu mereka tumbuh.

Tugas Anda:

Diberi dua angka,,, mdan n, output mbunga ditempatkan secara acak di n*nkisi.

Bunga tunggal terlihat seperti ini:

&
|

Posisi bunga ditentukan oleh tempatnya &. Saat menempatkan dua bunga secara acak, tidak ada dua yang berada di tempat yang sama. Jika satu bunga &tumpang tindih dengan bunga lain |, perlihatkan &. Baris bawah bunga mungkin tidak mengandung apapun &.

Input dapat berupa angka atau string, melalui salah satu metode standar.

Output dapat berupa daftar string, masing-masing string mewakili satu baris grid, atau string yang dibatasi mengikuti pedoman yang sama dengan daftar. Metode keluaran standar. Whatevers trailing diperbolehkan, dan Anda dapat menggunakan tab untuk memisahkan bunga Anda. Perhatikan bahwa setiap kisi harus diisi penuh, dengan spasi atau sesuatu.

Perhatikan bahwa input akan selalu valid, Anda akan selalu dapat masuk secara hukum mbunga ke dalam noleh njaringan.

Kasus uji:

Karena hanya test case yang sangat ketat yang dapat dijamin, karena seluruh bit "penempatan acak", itu akan menjadi satu-satunya jenis test case dengan jawaban yang disediakan. Tetapi saya akan mencoba semua pengiriman secara online untuk memastikan bahwa mereka sah menggunakan beberapa kasus uji juga.

Masukan untuk kasus uji diberikan dalam formulir m, n.

Input: 2, 2
Output:

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

&&&
&&&
|||

Perhatikan bahwa baris baru setelah kata Output:dalam kasus uji adalah opsional.

Kasus uji lainnya:

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

Golf kode sehingga kode terpendek menang!

Terima kasih kepada ComradeSparklePony untuk membuat tantangan ini dan mempostingnya di kotak hadiah Secret Santa !. Posting kotak pasir

Christopher
sumber
2
Ketika Anda mengatakan "secara acak", apakah setiap hasil yang mungkin perlu memiliki probabilitas yang sama?
xnor

Jawaban:

5

Jelly , 33 byte

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

Cobalah online!

Bagaimana?

²‘;⁹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
sumber
Pikiranku telah tertiup
Christopher
Apakah Anda bertukar makna mdan natau mengapa Anda melakukannya square m? dengan nilad ?
Titus
Apakah 33 karakter ini benar-benar hanya 33 byte?
Titus
1
@ Titus Saya tidak menukar artinya, saya menukar urutan input (dan dengan melakukan itu mengacaukan penjelasannya), jadi terima kasih telah menangkapnya. Nilad, (sebagai lawan dari monad atau angka dua atau ...) adalah fungsi yang tidak mengambil input dan mengembalikan nilai - karena konstanta seperti itu adalah nilad, karena merupakan input tunggal untuk fungsi atau program. Ini benar-benar 33 byte yang berbeda - karakter hanya sebuah pengkodean dari 256 byte yang digunakan Jelly sebagaimana ditautkan oleh kata byte di header.
Jonathan Allan
Anda hampir kehilangan saya di rotate. Kerja bagus; kerusakan luar biasa!
Titus
4

PHP (> = 7.1), 135 131 128 116 110 110 byte

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

mengambil input dari argumen baris perintah; jalankan dengan -nratau coba online .

kerusakan

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
    ;
Titus
sumber
1
Anda menambahkan byte untuk bendera, bukan?
Christopher
@Christopher -rgratis ; ia memberi tahu PHP untuk menjalankan kode dari argumen baris perintah. -nme-reset PHP ke pengaturan default.
Titus
1
@ JonathanAllan Preset versi tampaknya tergantung pada kunjungan Anda sebelumnya; mungkin kue.
Titus
3

Python 2 , 150 byte

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

Cobalah online!

Bagaimana?

Diambil input()dari STDIN dan membongkar tuple yang disediakan (string dipisahkan koma bilangan bulat desimal seperti 3,6) ke ndan m.

Menciptakan n*(n-1)"bunga petak" yang teratur, satu dimensi b, dengan menggabungkan:
- daftar yang berisi "bunga" [1]berulang mkali; dan
- daftar yang berisi "spasi" [0]berulang n*~-n-mkali *.

* Operator kecebong ~( ~x=-1-x) menyimpan 2 byte dengan n*~-n-mmenggantikan tampilan yang lebih normal n*(n-1)-m.

Mengocok (menggunakan random's shufflefungsi) ini petak bunga untuk menempatkan bunga-bunga dan ruang secara acak di antara n*(n-1)posisi.

Langkah-langkah melalui baris 0-diindeks r,, dan printsmasing - masing pada gilirannya untuk membuat petak bunga dua dimensi dari ...

Bunga dua dimensi terakhir ( n*n) memiliki tangkai,, ssatu baris di bawah kepala bunga f,, jika dan hanya jika tidak ada kepala bunga untuk ditampilkan. Hal ini dicapai dengan XORing ( ^) fdengan -smana fdan sadalah 1s dan 0s dari sebelum dan menggunakan hasilnya untuk indeks ke dalam panjang 3 tali ' &|':

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

Untuk mendapatkan fdan syang zipfungsi yang digunakan dengan dua salinan dari satu petak bunga dimensi, satu dengan nspasi tambahan (kepala bunga) dan satu dengan nruang terkemuka (batang). Semuanya dibuat untuk setiap baris (untuk menyimpan byte), dan baris yang diperlukan diiris menggunakan [r*n:r*n+n].

Jonathan Allan
sumber
2

Python 2 , 184 179 byte

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

Cobalah online!

ovs
sumber
2

Python 2 , 129 byte

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

Cobalah online!

Menghasilkan string keluaran satu karakter pada satu waktu. Secara acak memilih apakah sel saat ini adalah bunga dengan probabilitas sama dengan jumlahnyam bunga yang tersisa dibagi dengan jumlah ruang yang tersisa. Menambahkan baris baru setiap nkarakter. Sel kosong diisi dengan batang |jika simbol ndari ujung adalah a &.

Tidak
sumber
1

PHP, 111 Bytes

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

Versi Online

-1 Byte untuk Newline fisik

solusi 115 Bytes menggunakan maks

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

Cara ini dengan 137 Bytes mengocok bagian pertama dari string

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
sumber
1

JavaScript (ES6), 157 byte

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>

Penjelasan: Membuat array yang mewakili kisi-kisi bunga plus baris baru. Secara acak mencari kotak kosong di mana untuk menempatkan bunga sampai jumlah bunga yang diinginkan tercapai. Akhirnya batang bunga dihasilkan di mana ada ruang untuk mereka.

Neil
sumber
Untuk beberapa alasan ini melempar kesalahan ketika n = 2 dan m = 3.
Shaggy
@ Shaggy Itu karena hanya ada ruang untuk 2 bunga.
Neil
Ah, saya membacanya dengan cara yang salah. Permintaan maaf.
Shaggy
1

Arang , 27 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Nθ

Masukan n.

Ubah arah pencetakan standar ke bawah.

FN«

Masukan mdan putar itu berkali-kali.

J‽θ‽⊖θ

Lompat ke lokasi acak di grid.

W⁼KK&J‽θ‽⊖θ

Jika sudah ada bunga, teruslah melompat ke lokasi acak sampai tempat yang cocok ditemukan.

&

Cetak kepala bunga.

¬KK

Cetak tangkai jika belum ada kepala bunga di bawah ini.

Neil
sumber