ปลูกดอกไม้!


11

ฤดูใบไม้ผลิเพิ่งมาถึงและเกือบถึงเวลาที่ดอกไม้เริ่มงอก ดังนั้นฉันต้องการให้คุณช่วยพวกเขาเติบโต

งานของคุณ:

กำหนดตัวเลขสองตัวmและnเอาท์พุทmดอกไม้วางสุ่มบนn*nกริด

ดอกไม้เดียวมีลักษณะดังนี้:

&
|

ตำแหน่งของดอกไม้จะถูกกำหนดโดยที่มัน&เป็น เมื่อวางดอกไม้สองดอกแบบสุ่มจะไม่มีดอกไม้สองดอกอยู่ในที่เดียวกัน หากหนึ่งในดอกไม้&คาบเกี่ยวดอกไม้อื่น|, &แสดง &แถวด้านล่างของดอกไม้อาจจะไม่ได้มีการใด ๆ

อินพุตอาจเป็นตัวเลขหรือสตริงโดยใช้วิธีมาตรฐานใด ๆ ก็ได้

เอาต์พุตสามารถเป็นรายการของสตริงแต่ละสตริงที่แทนหนึ่งแถวของตารางหรือสตริงที่มีตัวคั่นตามแนวทางเดียวกันกับรายการ วิธีการมาตรฐานของการส่งออก อนุญาตให้ใช้อุปกรณ์ต่อท้ายได้และคุณสามารถใช้แท็บเพื่อแยกดอกไม้ของคุณ โปรดทราบว่าทุกกริดต้องถูกเติมเต็มอย่างสมบูรณ์พร้อมช่องว่างหรือบางสิ่งบางอย่าง

โปรดทราบว่าการป้อนข้อมูลจะถูกต้องเสมอคุณจะสามารถใส่mดอกไม้ลงในตารางได้nตามnกฎหมาย

กรณีทดสอบ:

เนื่องจากสามารถรับประกันเคสทดสอบที่คับแคบได้มากเนื่องจากบิต "การจัดวางแบบสุ่ม" ทั้งหมดนั้นจะเป็นเคสทดสอบชนิดเดียวที่มีคำตอบให้ แต่ฉันจะลองใช้การส่งออนไลน์ทั้งหมดเพื่อให้แน่ใจว่าถูกต้องโดยใช้กรณีทดสอบด้วย

m, nการป้อนข้อมูลสำหรับกรณีการทดสอบจะได้รับในรูปแบบ

Input: 2, 2
Output:

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

&&&
&&&
|||

โปรดทราบว่าการขึ้นบรรทัดใหม่หลังจากคำOutput:ในกรณีทดสอบเป็นทางเลือก

กรณีทดสอบอื่น ๆ :

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

รหัสกอล์ฟรหัสที่สั้นที่สุดชนะ!

ขอบคุณ ComradeSparklePony สำหรับการท้าทายนี้และโพสต์ไว้ในกล่องของขวัญของ Secret Santa! โพสต์ Sandbox


2
เมื่อคุณพูดว่า "สุ่ม" ผลลัพธ์ที่เป็นไปได้ทุกอย่างจำเป็นต้องมีความน่าจะเป็นที่เท่ากันหรือไม่?
xnor

คำตอบ:


5

เยลลี่ 33 ไบต์

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

ลองออนไลน์!

อย่างไร?

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

ใจของฉันถูกปลิวไปแล้ว
คริสโตเฟอร์

คุณไม่สลับความหมายของmและnหรือทำไมคุณทำsquare m? กับniladคืออะไร?
ติตัส

33 ตัวอักษรเหล่านี้มีขนาดเพียง 33 ไบต์จริงหรือ
ติตัส

1
@Titus ฉันไม่ได้สลับความหมายฉันเปลี่ยนคำสั่งอินพุต (และในการทำคำอธิบายที่ยุ่งเหยิง) ดังนั้นขอบคุณสำหรับการจับ nilad (ตรงข้ามกับ monad หรือ dyad หรือ ... ) เป็นฟังก์ชันที่ไม่มีอินพุตและส่งคืนค่า - เช่นค่าคงที่คือ nilad เช่นเดียวกับอินพุตหรือฟังก์ชัน เหล่านี้มี 33 ไบต์ที่แตกต่างกันจริงๆ - ตัวละครเป็นเพียงการเข้ารหัส256 ไบต์ที่ Jelly ใช้เป็นลิงก์โดยคำว่าไบต์ในส่วนหัว
Jonathan Allan

คุณเกือบสูญเสียฉันrotateไป เยี่ยมมาก พังทลายที่ยอดเยี่ยม!
ติตัส

4

PHP (> = 7.1), 135 131 128 116 110 110ไบต์

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

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง ทำงานด้วย-nrหรือทดสอบออนไลน์

แตกหัก

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
คุณเพิ่มไบต์สำหรับค่าสถานะใช่ไหม
Christopher

@Christopher -rฟรี ; มันบอก PHP เพื่อเรียกใช้รหัสจากอาร์กิวเมนต์บรรทัดคำสั่ง -nรีเซ็ต PHP เป็นค่าเริ่มต้น
ติตัส

1
@JonathanAllan เวอร์ชันที่ตั้งไว้ล่วงหน้าดูเหมือนจะขึ้นอยู่กับการเยี่ยมชมครั้งก่อนของคุณ อาจเป็นคุกกี้
ติตัส

3

Python 2 , 150 ไบต์

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

ลองออนไลน์!

อย่างไร?

ใช้เวลาinput()จาก STDIN และ unpacks tuple ที่ให้ไว้ (จุลภาคคั่นสตริงของจำนวนเต็มทศนิยมเช่น3,6) ลงและnm

สร้างคำสั่งn*(n-1)"flowerbed" แบบยาวหนึ่งมิติbโดยเชื่อมต่อกัน:
- รายการที่มี "ดอกไม้" [1]ซ้ำหลายmครั้ง และ
- รายการที่มี "ช่องว่าง" [0]ซ้ำหลายn*~-n-mครั้ง *

* ผู้ประกอบการกบ~( ~x=-1-x) บันทึก 2 ไบต์ที่มีอยู่ในสถานที่ปกติมากขึ้นมองn*~-n-mn*(n-1)-m

Shuffles (ใช้randomของshuffleฟังก์ชั่น) นี่ flowerbed ที่จะวางดอกไม้และพื้นที่สุ่มหมู่n*(n-1)ตำแหน่ง

ทำตามขั้นตอนในแถว 0 ที่มีการจัดทำดัชนีrและprintsแต่ละอันจะสร้างดอกไม้สองมิติจากหนึ่งมิติหนึ่ง ...

n*nดอกไม้สองมิติสุดท้าย ( ) มีก้าน,, sหนึ่งแถวด้านล่างหัวดอกไม้f, ถ้าหากเพียงว่าไม่มีหัวดอกไม้ที่จะแสดง นี่คือความสำเร็จโดย XORing ( ^) fกับ-sที่ไหนfและsเป็น1s และ0s จากก่อนและใช้ผลการจัดทำดัชนีลงในความยาว 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.

ที่จะได้รับfและฟังก์ชั่นใช้กับสำเนาที่สองของ flowerbed หนึ่งมิติหนึ่งที่มีช่องว่างต่อท้าย (หัวดอกไม้) และเป็นหนึ่งเดียวกับช่องว่างนำ (ก้าน) สิ่งที่ทั้งถูกสร้างขึ้นสำหรับแต่ละแถว (เพื่อประหยัดไบต์) และแถวที่ต้องหั่นออกมาใช้szipnn[r*n:r*n+n]



2

Python 2 , 129 ไบต์

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

ลองออนไลน์!

สร้างสตริงเอาต์พุตหนึ่งตัวอักษรในแต่ละครั้ง สุ่มเลือกว่าเซลล์ปัจจุบันเป็นดอกไม้ที่มีความน่าจะเป็นเท่ากับจำนวนmดอกไม้ที่เหลืออยู่หารด้วยจำนวนช่องว่างที่เหลืออยู่ เพิ่มบรรทัดใหม่ทุกnตัวละคร เซลล์ว่างเปล่าที่เต็มไปด้วยต้นกำเนิด|ถ้าสัญลักษณ์ที่จากปลายเป็นn&


1

PHP, 111 ไบต์

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

เวอร์ชั่นออนไลน์

-1 ไบต์สำหรับฟิสิคัล Newline

โซลูชัน 115 Bytes ใช้สูงสุด

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

ด้วยวิธีนี้ 137 Bytes สับเปลี่ยนส่วนแรกของสตริง

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 ไบต์

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>

คำอธิบาย: สร้างอาร์เรย์ที่แสดงถึงกริดของดอกไม้รวมถึงการขึ้นบรรทัดใหม่ สุ่มค้นหาสี่เหลี่ยมที่ว่างซ้ำ ๆ ซ้ำ ๆ เพื่อวางดอกไม้จนกว่าจะถึงจำนวนดอกไม้ที่ต้องการ ในที่สุดลำต้นของดอกไม้ถูกสร้างขึ้นที่มีที่ว่างสำหรับพวกเขา


ด้วยเหตุผลบางอย่างนี่จะพ่นข้อผิดพลาดเมื่อ n = 2 และ m = 3
Shaggy

@Shaggy นั่นเป็นเพราะมีห้องสำหรับดอกไม้ 2 ดอกเท่านั้น
Neil

อ่าฉันอ่านผิดแล้ว 'รอบ ขอโทษ.
Shaggy

1

ถ่าน 27 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ

nอินพุต

เปลี่ยนทิศทางการพิมพ์เริ่มต้นเป็นแบบลงด้านล่าง

FN«

อินพุตmและวนซ้ำหลายครั้ง

J‽θ‽⊖θ

ข้ามไปยังตำแหน่งสุ่มบนกริด

W⁼KK&J‽θ‽⊖θ

หากมีดอกไม้อยู่แล้วให้กระโดดไปยังสถานที่สุ่มจนกว่าจะพบจุดที่เหมาะสม

&

พิมพ์หัวดอกไม้

¬KK

พิมพ์ก้านถ้าไม่มีหัวดอกไม้ด้านล่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.