Trồng vài bông hoa!


11

Mùa xuân gần đây đã đến, và gần đến lúc hoa bắt đầu đâm chồi. Vì vậy, tôi muốn bạn giúp họ phát triển.

Nhiệm vụ của bạn:

Cho hai số, mn, mhoa đầu ra được đặt ngẫu nhiên trên một n*nlưới.

Một bông hoa duy nhất trông như thế này:

&
|

Vị trí của một bông hoa được xác định bởi vị trí của nó &. Khi đặt ngẫu nhiên hai bông hoa, không có hai cái có thể ở cùng một nơi. Nếu một bông hoa &chồng lên một bông hoa khác |, hãy hiển thị &. Hàng hoa dưới cùng có thể không chứa bất kỳ &.

Đầu vào có thể là một số hoặc một chuỗi, thông qua bất kỳ phương thức tiêu chuẩn nào.

Đầu ra có thể là một danh sách các chuỗi, mỗi chuỗi đại diện cho một hàng của lưới hoặc một chuỗi được phân tách theo cùng một hướng dẫn như danh sách. Phương pháp tiêu chuẩn đầu ra. Những người thích buôn bán được phép và bạn có thể sử dụng các tab để tách hoa của mình. Lưu ý rằng mọi lưới phải được lấp đầy hoàn toàn, với khoảng trắng hoặc thứ gì đó.

Lưu ý rằng các đầu vào sẽ luôn luôn có giá trị, bạn sẽ luôn luôn có thể phù hợp về mặt pháp lý các mhoa vào nbằng nlưới.

Các trường hợp thử nghiệm:

Vì chỉ các trường hợp kiểm tra rất chặt chẽ mới có thể được đảm bảo, do toàn bộ bit "vị trí ngẫu nhiên", đó sẽ là loại trường hợp kiểm thử duy nhất có câu trả lời được cung cấp. Nhưng tôi sẽ thử tất cả các bài nộp trực tuyến để đảm bảo rằng chúng hợp lệ khi sử dụng một số trường hợp thử nghiệm.

Đầu vào cho các trường hợp thử nghiệm được đưa ra trong mẫu m, n.

Input: 2, 2
Output:

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

&&&
&&&
|||

Lưu ý rằng dòng mới sau từ Output:trong các trường hợp thử nghiệm là tùy chọn.

Các trường hợp thử nghiệm khác:

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

Mã golf để mã ngắn nhất chiến thắng!

Cảm ơn ComradeSparklePony đã thực hiện thử thách này và đăng nó trong hộp quà tặng của ông già Noel!. Bài Sandbox


2
Khi bạn nói "ngẫu nhiên", mọi kết quả có thể có cần phải có xác suất như nhau không?
xnor

Câu trả lời:


5

Thạch , 33 byte

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

Hãy thử trực tuyến!

Làm sao?

²‘;⁹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

Tâm trí của tôi đã bị thổi bay
Christopher

Bạn đã trao đổi ý nghĩa của mnhoặc tại sao bạn square m? wth là một con số không?
Tít

Có phải 33 ký tự này thực sự chỉ có 33 byte?
Tít

1
@Titus Tôi không trao đổi ý nghĩa, tôi đã trao đổi thứ tự đầu vào (và khi làm như vậy làm rối tung lời giải thích), vì vậy cảm ơn vì đã nắm bắt được điều đó. Một nilad, (trái ngược với một đơn nguyên hoặc một dyad hoặc ...) là một hàm không có đầu vào và trả về một giá trị - như một hằng số là một nilad, như là một đầu vào duy nhất cho một chức năng hoặc chương trình. Đây thực sự là 33 byte khác nhau - các ký tự chỉ là một mã hóa của 256 byte Jelly sử dụng như được liên kết với các byte từ trong tiêu đề.
Jonathan Allan

Bạn gần như mất tôi lúc rotate. Bạn đã làm rất tốt; sự cố tuyệt vời!
Tít

4

PHP (> = 7.1), 135 131 128 116 110 109 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];

lấy đầu vào từ các đối số dòng lệnh; chạy với -nrhoặc kiểm tra nó trực tuyến .

phá vỡ

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
    ;

1
Bạn đã thêm byte cho cờ phải không?
Christopher

@Christopher -rlà miễn phí ; nó bảo PHP chạy mã từ đối số dòng lệnh. -nĐặt lại PHP về cài đặt mặc định.
Tít

1
@Jonathan ALLan Phiên bản cài sẵn ở đó dường như phụ thuộc vào lần truy cập trước của bạn; có lẽ là một cái bánh quy
Tít

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

Hãy thử trực tuyến!

Làm sao?

Lấy input()từ STDIN và giải nén bộ dữ liệu được cung cấp (một chuỗi các số nguyên thập phân được phân tách bằng dấu phẩy như 3,6) vào nm.

Tạo một n*(n-1)"thảm hoa" có thứ tự, dài một chiều b, bằng cách ghép:
- một danh sách chứa "hoa" [1]lặp đi lặp lại m; và
- một danh sách chứa thời gian [0]lặp lại "khoảng trắng" n*~-n-m*.

* Toán tử nòng nọc ~( ~x=-1-x) lưu 2 byte n*~-n-mthay cho giao diện bình thường hơn n*(n-1)-m.

Shuffles (sử dụng randomcủa shufflechức năng) này thảm hoa để đặt những bông hoa và không gian một cách ngẫu nhiên giữa các n*(n-1)vị trí.

Bước qua các hàng được lập chỉ mục 0 rprintslần lượt tạo các hàng hoa hai chiều từ một chiều ...

n*nĐầm hoa hai chiều ( ) cuối cùng có cuống, smột hàng bên dưới đầu hoa f, nếu và chỉ khi không có đầu hoa để hiển thị. Điều này đạt được bằng XORing ( ^) fvới -svị trí fs1s và 0s từ trước và sử dụng kết quả để lập chỉ mục vào chuỗi 3 độ dài ' &|':

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

Để có được fscác zipchức năng được sử dụng với hai bản sao của một trong những thảm hoa chiều, một với nkhông gian trailing (Thủ trưởng hoa) và một với nkhông gian hàng đầu (các thân cây). Toàn bộ điều được tạo cho mỗi hàng (để lưu byte) và hàng được yêu cầu được cắt ra bằng cách sử dụng [r*n:r*n+n].



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

Hãy thử trực tuyến!

Tạo một chuỗi ký tự đầu ra tại một thời điểm. Chọn ngẫu nhiên xem ô hiện tại có phải là hoa với xác suất bằng số mhoa còn lại chia cho số không gian còn lại không. Thêm một dòng mới mỗi nnhân vật. Một ô trống được điền đầy một thân |nếu ký hiệu ntừ cuối là a &.


1

PHP, 111 byte

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

Phiên bản trực tuyến

-1 Byte cho một dòng mới vật lý

một giải pháp 115 byte sử dụng tối đa

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

Cách này với 137 Byte xáo trộn phần đầu tiên của chuỗi

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

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>

Giải thích: Tạo một mảng đại diện cho lưới hoa cộng với dòng mới. Đệ quy ngẫu nhiên tìm kiếm các ô vuông trống để đặt hoa cho đến khi đạt được số lượng hoa mong muốn. Cuối cùng, thân của những bông hoa được tạo ra nơi có không gian cho chúng.


Vì một số lý do, điều này sẽ gây ra lỗi khi n = 2 và m = 3.
Xù xì

@Shaggy Đó là vì chỉ có 2 hoa.
Neil

Ah, tôi đã đọc sai cách 'vòng. Lời xin lỗi.
Xù xì

1

Than , 27 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Đầu vào n.

Thay đổi hướng in mặc định thành hướng xuống.

FN«

Đầu vào mvà vòng lặp nhiều lần.

J‽θ‽⊖θ

Nhảy đến một vị trí ngẫu nhiên trên lưới.

W⁼KK&J‽θ‽⊖θ

Nếu đã có một bông hoa, hãy tiếp tục nhảy đến các vị trí ngẫu nhiên cho đến khi tìm thấy một vị trí thích hợp.

&

In đầu hoa.

¬KK

In cuống nếu chưa có đầu hoa bên dưới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.