เมทริกซ์ยุบ


18

ที่เกี่ยวข้อง: การออกแบบ Let 's หลักกระเบื้องโมเสค , พิมพ์ / Output L-phabet Sandbox โพสต์ที่นี่

รับ 2 อินพุตC = columns and rows, S = starting pointเอาต์พุตเมทริกซ์ดังนี้:

Input 4, 3

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

คำอธิบาย

ป.ร. ให้ไว้ C = 4, S = 3

1) สร้างC x Cเมทริกซ์ที่เต็มไปด้วย0

         4 columns
4     _____|____
     |          |
r  --0  0   0   0
o |  0  0   0   0
w |  0  0   0   0
s  --0  0   0   0

2) กรอกข้อมูลที่มีSค่าที่อยู่ในแถวและคอลัมน์Sแล้วลบ 1 จากและทำซ้ำจนกว่าS S = 0กรณีนี้S = 3

             Column 3 
S = 3           |
                v
        0   0   3   0
        0   0   3   0
Row 3-->3   3   3   0
        0   0   0   0


         Column 2
S = 2       |
            v
        0   2   3   0
Row 2-->2   2   3   0
        3   3   3   0
        0   0   0   0


     Column 1
S=1     |
        v
Row 1-->1   2   3   0
        2   2   3   0
        3   3   3   0
        0   0   0   0



Final Result

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

กฎระเบียบ

  • สมมติ C >= S >= 0
  • ผลลัพธ์สามารถเป็นเมทริกซ์, รายการของรายการ, อาร์เรย์ (1 มิติหรือ 2 มิติ) เป็นต้น
  • คุณสามารถรับอินพุตผ่านรูปแบบ I / O เริ่มต้นใด ๆ
  • โปรแกรมฟังก์ชั่น ฯลฯ ... ของคุณอาจเป็น 1 ดัชนีหรือดัชนี 0 โปรดระบุว่ารายการใดเป็น

หมายเหตุคำอธิบายคือการจัดทำดัชนี 1


เกณฑ์การชนะ

คำตอบ:


6

เยลลี่ขนาด 8 ไบต์

»>⁴¬×»µþ

ลองออนไลน์!

มันทำงานอย่างไร

อะตอมผลิตภัณฑ์ด้านนอกของเยลลี่ ( þ)

คุณสามารถนึกถึงอะตอมผลิตภัณฑ์ด้านนอกของเยลลี่ในþฐานะผู้ดำเนินการด่วนที่ได้รับอาร์กิวเมนต์จำนวนเต็มและY (ในกรณีนี้X = Y = อาร์กิวเมนต์แรก  ) จะสร้างเมทริกซ์ของ tuples ดังต่อไปนี้:XYX=Y=อาร์กิวเมนต์แรก 

[(1,1)(2,1)(3,1)(X,1)(1,2)(2,2)(3,2)(X,2)(1,Y)(2,Y)(3,Y)(X,Y)]

นอกจากนี้ยังใช้ลิงก์ก่อนที่จะเชื่อมโยงกับทุกคู่ลองเรียกมันว่า ซึ่งทำตัวเหมือนฟังก์ชั่นซึ่งรับสองอาร์กิวเมนต์สร้างสิ่งนี้:

[(1,1)(2,1)(3,1)(X,1)(1,2)(2,2)(3,2)(X,2)(1,Y)(2,Y)(3,Y)(X,Y)]

มันเกี่ยวข้องกับงานในมืออย่างไร?

สิ่งนี้ทำงานได้โดยสังเกตว่าทุกค่าในผลลัพธ์ที่คาดหวังเป็นเพียงตารางดัชนีสูงสุดหรือถ้าค่าสูงสุดนี้เกินอาร์กิวเมนต์ที่สองของเรา ดังนั้นเราสามารถสร้างลิงค์ต่อไปนี้เพื่อทำการแมปนี้:0

»>⁴¬×» – Dyadic (2-argument) link.
»      – Maximum of the X, Y coordinates.
 >⁴    – Check if this exceeds the second argument of the program.
   ¬   – Negate this boolean.
    ×» – And multiply by the maximum, computed again.

6

R , 47 41 ไบต์

function(C,S,m=outer(1:C,1:C,pmax))m*!m>S

ลองออนไลน์!

1 การจัดทำดัชนี สร้างผลลัพธ์สำหรับS==C(ไม่มีศูนย์) จากนั้นเป็นศูนย์เซลล์ที่มีค่า>Sโดยใช้การคูณเมทริกซ์ (ขอบคุณ Giuseppe สำหรับ 4 ไบต์!)


เรียบร้อย! การคูณจะทำให้คุณได้รับไมล์สะสมที่ดี: 43 ไบต์
จูเซปเป้

@Giuseppe tx! ผมสามารถที่จะบันทึกอีกสอง :)
Jayce


5

Haskell , 47 45 ไบต์

-2 ไบต์โดยการเปลี่ยนรูปแบบผลลัพธ์เป็นรายการหนึ่งมิติ

c&s|x<-[1..c]=[sum[j|j<=s]|j<-x>>=(<$>x).max]

ลองออนไลน์!

คำอธิบาย

คำx >>= (<$> x) . maxนี้เป็นเวอร์ชั่นของกอล์ฟ

concat [ max i <$> x | i <- x ]

ซึ่งประเมิน[1,2,3,4..c, 2,2,3,4..c, 3,3,3,4..c, ..., c,c,c,c..c]ว่า ตอนนี้เราจะต้องบังคับให้ค่าที่0เมื่อพวกเขาเกินกว่าที่เราประสบความสำเร็จกับssum [ j | j <= s]



3

APL (Dyalog)ขนาด 12 ไบต์

o×⎕≥o←∘.⌈⍨⍳⎕

ลองออนไลน์!


จะo×⎕≥o←∘.⌈⍨⍳อนุญาตให้บางสิ่งบางอย่างหรือคุณต้องมอบหมายให้ฟังก์ชั่นเพื่อที่จะนับ?
Zacharý

@ Zachary คาดเดาของฉันเป็นที่หนึ่งจะต้องมีการใส่ไว้ใน tradfn ที่มีข้อโต้แย้งหรือ dfns
ยูเรียล

3

JavaScript (ES6), 61 ไบต์

รับอินพุตในรูปแบบ currying (c)(s)โดยที่sถูกทำดัชนี 1 รายการ ส่งคืนอาร์เรย์ 1 มิติ

c=>s=>[...Array(c*c)].map((_,k)=>(k=k%c>k/c?k%c:k/c)<s?-~k:0)

ลองออนไลน์!


3

เยลลี่ 6 ไบต์

⁴Ri»µþ

โปรแกรมเต็มรูปแบบ * รับจำนวนเต็มCและSพิมพ์การแทนค่าเยลลี่ของรายการจำนวนเต็มตามที่กำหนดไว้ (1 ดัชนี)

ลองออนไลน์! (จัดรูปแบบผลลัพธ์ของ dyad เป็นตารางตัวเลขเพื่อให้อ่านง่ายขึ้น)

อย่างไร?

⁴Ri»µþ - Main Link: C, S
     þ - outer product with:
    µ  -   the monadic function (i.e. f(x,y) for x in [1..C] for y in [1..C]):
   »   -     maximum (of x and y)
⁴      -     program's 4th argument = 2nd input = S
 R     -     range = [1,2,3,...S]
  i    -     first index of (the maximum) in (the range) or 0 if not found
       - as a full program: implicit print

* เหตุนี้เป็นโปรแกรมเต็มรูปแบบจะลงไปใช้ในการเข้าถึงอาร์กิวเมนต์โปรแกรมที่ เป็นลิงค์ dyadic รหัสนี้จะขึ้นอยู่กับว่าโปรแกรมที่ใช้มันถูกเรียกว่า
ลิงก์ dyadic ที่นำกลับมาใช้ใหม่ใน 8 ไบต์ (ใช้ S ทางด้านซ้ายและ C ทางด้านขวา): ลิงก์ dyadic ที่นำมาใช้ซ้ำได้ใน 8 ไบต์ (การ C ทางด้านซ้ายและ S ทางด้านขวา):RiⱮⱮ»þ`}
RiⱮⱮ⁹»þ¤


2

Java 10, 88 ไบต์

C->S->{var r=new int[C][C];for(;S>0;)for(int s=S--;s-->0;)r[S][s]=r[s][S]=S+1;return r;}

ลองออนไลน์

คำอธิบาย:

C->S->{                     // Method with two int parameters and int-matrix return-type
  var r=new int[C][C];      //  Result-matrix of size `C` by `C`
  for(;S>0;)                //  Loop as long as `S` is not 0 yet:
    for(int s=S--;s-->0;)   //   Inner loop `s` in the range (`S`, 0]
                            //   (and decrease `S` by 1 in the process with `S--`)
      r[S][s]=r[s][S]=S+1;  //    Set the values at both {`S`,`s`} and {`s`,`S`} to `S+1`
  return r;}                //  Return the result

2

PHP , 92 ไบต์

นี่คือ "การจัดทำดัชนี 1"

<?list(,$c,$s)=$argv;for(;$i++<$c;print"\n")for($j=0;$j++<$c;)echo$s<$i||$s<$j?0:max($i,$j);

วิธีเรียกใช้:

php -n <filename> <c> <s>

ตัวอย่าง:

php -n collapsing_matrice.php 8 6

หรือลองออนไลน์!



2

Excel VBA ขนาด 65 ไบต์

ฟังก์ชั่นหน้าต่างทันทีที่ใช้ข้อมูลจากและผลในช่วง[A1:B1][C1].Resize([A1],[A1])

[C1].Resize([A1],[A1])=0:For s=-[B1]To-1:[C1].Resize(-s,-s)=-s:Next

อินพุต / เอาต์พุต

อินพุตอยู่ในช่วง [A1:B1]

I / O



2

MATLAB, 58 ไบต์ (ขอบคุณผู้ใช้ที่ไม่ระบุตัวตน)

function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:j,1:j)=j;end

เพียงแค่เติมองค์ประกอบของเมทริกซ์ด้วยจำนวนที่เหมาะสมวิ่งวน บางทีเป็นไปได้ที่จะฉลาดด้วยarrayfun


คุณไม่จำเป็นต้องตั้งชื่อฟังก์ชั่นและคุณสามารถใช้zeros(c)ตู้นิรภัยบางไบต์ คุณเห็นด้วยคำตอบระดับแปดเสียงนี้ฉันคิดว่ามันจะทำงานใน Matlab ด้วยหรือไม่
ბიმო

@ OMᗺคุณไม่สามารถตั้งชื่อตัวแปรภายในฟังก์ชันที่ไม่ระบุชื่อใน matlab นอกจากนี้max()ต้องใช้อาร์กิวเมนต์ที่มีรูปร่างเหมือนกัน
aaaaa กล่าวว่าคืนสถานะโมนิก้า

1
function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:s,1:s)=j;endผู้ใช้ที่ไม่ระบุชื่อปัญหา
Jonathan Frech

@ JonathanFrech โอ้ฉันง่ายมาก :-( เพียงแค่ต้องเป็นo(1:j,1:j)=j
aaaaa พูดว่าคืนสถานะโมนิก้า



1

ถ่าน 19 ไบต์

Eθ⪫IEEθ⌈⟦ιλ⟧∧‹λη⊕λ 

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด 3 ไบต์ใช้ในการแปลงผลลัพธ์เป็นทศนิยมและจัดรูปแบบเป็นอย่างดี คำอธิบาย:

 θ                  Input `C`
E                   Map over implicit range
      θ             Input `C`
     E              Map over implicit range
          λ         Inner index
         ι          Outer index
       ⌈⟦  ⟧        Maximium
    E               Map over results
              λ     Current value
               η    Input `S`
             ‹      Less than
                 λ  Current value
                ⊕   Incremented
            ∧       Logical AND
   I                Cast to string
  ⪫                 Join with spaces
                    Implicitly print on separate lines



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