สร้างเมทริกซ์ย่อยทั้งหมดของขนาดที่กำหนด


14

คุณจะได้รับเมทริกซ์จตุรัสของจำนวนเต็มMและอีกจำนวนเต็มบวกnอย่างเคร่งครัดมีขนาดเล็กกว่าขนาดของM งานของคุณคือการสร้างทุกตารางย่อยของเมทริกซ์Mขนาดn

สำหรับวัตถุประสงค์ของการท้าทายนี้เป็นตารางย่อยเมทริกซ์เป็นกลุ่มที่อยู่ติดกันแถวและคอลัมน์ที่มีอยู่ในM

รูปแบบอินพุต / เอาต์พุต

คุณมีอิสระที่จะเลือกรูปแบบที่เหมาะสมอื่น ๆ เหล่านี้เป็นเพียงตัวอย่าง

อินพุต

  • เมทริกซ์ในประเภทเมทริกซ์เนทีฟ (หากภาษาของคุณมี)
  • อาร์เรย์ 2 มิติ (อาร์เรย์ 1D ของอาร์เรย์แต่ละแถวสอดคล้องกับหนึ่งแถว / หนึ่งคอลัมน์)
  • อาร์เรย์ 1D (เนื่องจากเมทริกซ์เป็นจตุรัสเสมอ)
  • สตริง (คุณเลือกการเว้นวรรค แต่โปรดอย่าใช้สิ่งนี้ในทางที่ผิด) ฯลฯ

เอาท์พุต

  • เมทริกซ์ของเมทริกซ์
  • อาเรย์ 4D ที่แต่ละองค์ประกอบ (รายการ 3D) แสดงเมทริกซ์ย่อยในแถว / คอลัมน์
  • อาร์เรย์ 3 มิติที่แต่ละองค์ประกอบ (รายการ 2D) แสดงเมทริกซ์ย่อย
  • การแทนค่าสตริงของเมทริกซ์ย่อยที่ได้เป็นต้น

รายละเอียด

  • คุณอาจเลือกที่จะใช้ขนาดของMเป็นอินพุตเช่นกัน มันมีการประกันเพื่อมีอย่างน้อย2
  • การวางแนวของเอาต์พุตนั้นโดยพลการ: คุณอาจเลือกที่จะเอาท์พุทเมทริกซ์ย่อยเป็นรายการของคอลัมน์หรือรายการของแถว แต่ตัวเลือกของคุณจะต้องสอดคล้องกัน
  • คุณสามารถแข่งขันในภาษาการเขียนโปรแกรมใด ๆและสามารถรับอินพุตและให้เอาต์พุตผ่านวิธีการมาตรฐานใด ๆในขณะที่รับทราบว่าช่องโหว่เหล่านี้ถูกห้ามโดยค่าเริ่มต้น
  • นี่คือดังนั้นการส่งสั้นที่สุด (เป็นไบต์) สำหรับทุกภาษาที่ชนะ

ตัวอย่าง

รับn = 3และM :

 1 2 3 4
 5 6 7 8
 9 10 11 12
13 14 15 16

เมทริกซ์ย่อย3x3 ที่เป็นไปได้คือ:

+ ------- + + -------- + 1 2 3 4 1 2 3 4
| 1 2 3 | 4 1 | 2 3 4 | + -------- + + -------- +
| 5 6 7 | 8 5 | 6 7 8 | | 5 6 7 | 8 5 | 6 7 8 |
| 9 10 11 | 12 9 | 10 11 12 | | 9 10 11 | 12 9 | 10 11 12 |
+ ------- + + -------- + | 13 14 15 | 16 13 | 14 15 16 |
13 14 15 16 13 14 15 16 + -------- + + -------- +

ดังนั้นผลลัพธ์จะเป็น:

[[[1, 2, 3], [5, 6, 7], [9, 10, 11]], [[2, 3, 4], [6, 7, 8], [10, 11, 12]], [[5, 6, 7], [9, 10, 11], [13, 14, 15]], [[6, 7, 8], [10, 11, 12], [14, 15, 16]]]

ตามที่ระบุไว้ข้างต้นผลลัพธ์ของ:

[[[1, 5, 9], [2, 6, 10], [3, 7, 11]], [[2, 6, 10], [3, 7, 11], [4, 8, 12]], [[5, 9, 13], [6, 10, 14], [7, 11, 15]], [[6, 10, 14], [7, 11, 15], [8, 12, 16]]]

จะเป็นที่ยอมรับเช่นกันหากคุณเลือกที่จะส่งคืนเมทริกซ์ย่อยเป็นรายการของแถวแทน

กรณีทดสอบ

อินพุตM, n :

[[1,2,3],[5,6,7],[9,10,11]], 1
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], 3
[[100,-3,4,6],[12,11,14,8],[0,0,9,3],[34,289,-18,3]], 2
[[100,-3,4,6],[12,11,14,8],[9,10,11,12],[13,14,15,16]], 3

และผลลัพธ์ที่สอดคล้องกัน (เมทริกซ์ย่อยที่กำหนดเป็นรายการของแถว):

[[[1]],[[2]],[[3]],[[5]],[[6]],[[7]],[[9]],[[10]],[[11]]]
[[[1,2,3],[5,6,7],[9,10,11]],[[2,3,4],[6,7,8],[10,11,12]],[[5,6,7],[9,10,11],[13,14,15]],[[6,7,8],[10,11,12],[14,15,16]]]
[[[100,-3],[12,11]],[[-3,4],[11,14]],[[4,6],[14,8]],[[12,11],[0,0]],[[11,14],[0,9]],[[14,8],[9,3]],[[0,0],[34,289]],[[0,9],[289,-18]],[[9,3],[-18,3]]]
[[[100,-3,4],[12,11,14],[9,10,11]],[[-3,4,6],[11,14,8],[10,11,12]],[[12,11,14],[9,10,11],[13,14,15]],[[11,14,8],[10,11,12],[14,15,16]]]

หรือตามรายการของคอลัมน์:

[[[1]],[[2]],[[3]],[[5]],[[6]],[[7]],[[9]],[[10]],[[11]]]
[[[1,5,9],[2,6,10],[3,7,11]],[[2,6,10],[3,7,11],[4,8,12]],[[5,9,13],[6,10,14],[7,11,15]],[[6,10,14],[7,11,15],[8,12,16]]]
[[[100,12],[-3,11]],[[-3,11],[4,14]],[[4,14],[6,8]],[[12,0],[11,0]],[[11,0],[14,9]],[[14,9],[8,3]],[[0,34],[0,289]],[[0,289],[9,-18]],[[9,-18],[3,3]]]
[[[100,12,9],[-3,11,10],[4,14,11]],[[-3,11,10],[4,14,11],[6,8,12]],[[12,9,13],[11,10,14],[14,11,15]],[[11,10,14],[14,11,15],[8,12,16]]]]

โพสต์ Sandbox (ตอนนี้ถูกลบผู้ใช้ที่มีชื่อเสียงมากกว่า 2k เท่านั้นที่สามารถดูได้) ขอบคุณทุกคนที่ได้รับคำติชม
Mr. Xcoder

ดังนั้นรูปแบบผลลัพธ์นี้อนุญาตหรือไม่
Luis Mendo เมื่อ

@LuisMendo ใช่มันได้รับอนุญาต
Mr. Xcoder

คำตอบ:



5

MATL , 4 ไบต์

thYC

ปัจจัยการผลิตที่มีแล้วnM

เอาต์พุตเป็นเมทริกซ์โดยที่แต่ละคอลัมน์มีคอลัมน์ทั้งหมดของซับเมทริกซ์

ลองออนไลน์!

คำอธิบาย

thY    % Address the compiler with a formal, slightly old-fashioned determiner
C      % Convert input to ouput

จริงจังยิ่งขึ้นtรับอินพุตn โดยนัยและทำซ้ำในกองซ้อน hเชื่อมสำเนาทั้งสองnผลิตอาร์เรย์[N, N] YCรับอินพุตMโดยปริยายแยก[n, n] -ขนาดบล็อกทั้งหมดและจัดเรียงเป็นคอลัมน์ตามลำดับคอลัมน์ที่สำคัญ ซึ่งหมายความว่าคอลัมน์ของแต่ละบล็อกจะถูกจัดเรียงในแนวตั้งเพื่อสร้างคอลัมน์เดียว


1
LOL +1 สำหรับ "สรรพนามทางการที่ล้าสมัยเล็กน้อย" และสนามกอล์ฟที่ดีมาก
Giuseppe

@Giuseppe ฉันเพิ่งรู้ว่ามันเป็นตัวกำหนดไม่ใช่สรรพนาม: - /
Luis Mendo

ฉันเรียนรู้คำสรรพนามว่า "เจ้า / เจ้า" อยู่เสมอ นี่เป็นครั้งแรกที่ฉันได้ยินผู้ตัดสิน!
Giuseppe

@Giuseppe "เจ้า / ของคุณ" เป็นผู้กำหนดความเป็นเจ้าของนั่นคือพวกเขาใช้ชื่อ: "นี่คือรถของคุณ" "เจ้า / เจ้า" เป็นคำสรรพนามนั่นคือชื่อถูกละเว้น: "นี่คือของคุณ" และในขั้นต้นฉันสับสน "เจ้า" ด้วยสรรพนามส่วนตัวซึ่งจริง ๆ แล้วจะเป็น "เจ้า" สิ่งที่ฉันทำ :-)
Luis Mendo

4

APL (Dyalog Unicode) , 26 ไบต์SBCS

แลมบ์ดานิรนามโดยใช้nเป็นอาร์กิวเมนต์ซ้ายและMเป็นอาร์กิวเมนต์ขวา

{s↓(-s2⍴⌈¯1+⍺÷2)↓⊢⌺⍺ ⍺⊢⍵}

ลองออนไลน์!

{} แลมบ์ดานิรนามซึ่งเป็นอาร์กิวเมนต์ด้านซ้ายและเป็นอาร์กิวเมนต์ที่ถูกต้อง:

⊢⍵ ให้ค่าอาร์กิวเมนต์ที่ถูกต้อง ( แยก⍺ ⍺จาก)

⊢⌺⍺ ⍺เมทริกซ์ย่อย ทั้งหมดโดยรวมถึงขอบที่ทับซ้อนกัน (เหล่านั้นจะเต็มด้วยศูนย์)

(... )↓ วางองค์ประกอบตัวเลขต่อไปนี้ไว้ในสองมิติแรก:

  ⍺÷2 ครึ่งหนึ่งของ

  ¯1+ ลบหนึ่งบวกนั่น

   ปัดขึ้น

  2⍴ วนr eshape ไปยังรายการของสององค์ประกอบ

  s← เก็บในs(สำหรับs hards)

  - คัดค้าน (เช่นวางจากด้านหลัง)

s↓วางsองค์ประกอบตามมิติที่หนึ่งและสอง (จากด้านหน้า)


4

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

{(12 1 3 4⍉⊖)⍣(4×⌊⍺÷2)⊢⌺⍺ ⍺⊢⍵}

ลองออนไลน์!

แนวทางที่แตกต่างจากของAdám


คุณตั้งใจจะให้คำอธิบาย (หลังจากจบการเล่นกอล์ฟ) ฉันสนใจที่จะดูว่ามันทำงานอย่างไร (และฉันไม่รู้ APL เลย) :)
Emigna

@Emigna ใช่ถ้าฉันมีเวลาแล้ว
Erik the Outgolfer

ฉลาดมาก. หากคุณสามารถใช้ dyadic ได้สำเร็จสำหรับกรณีที่ไม่สำคัญคุณก็จะมีการเขียนโปรแกรมอาเรย์อย่างเชี่ยวชาญ
Adám

@ Adám Uh แม้ว่าฉันคิดว่าคำตอบนี้เป็นจริงที่ไม่ถูกต้อง :-( แก้ไข: คงที่ แต่ตอนนี้มันยาว 31 ไบต์ ...
Erik the Outgolfer

อย่าลังเลที่จะคัดลอกชุดทดสอบจากการส่งของฉัน
อดัม

3

R , 75 ไบต์

function(M,N,S,W=1:N,g=N:S-N)for(i in g)for(j in g)print(M[i+W,j+W,drop=F])

ลองออนไลน์!

ใช้เวลาM, NและSize ของเมทริกซ์

พิมพ์เมทริกซ์ผลลัพธ์ไปยัง stdout; drop=Fเป็นสิ่งจำเป็นดังนั้นในN=1กรณีการจัดทำดัชนีไม่ได้วางdimแอตทริบิวต์และอัตราผลตอบแทนมากกว่าmatrixvector


3

J , 11 8 ไบต์

-3 ไบท์ขอบคุณไมล์

<;._3~,~

ลองออนไลน์!


1
วิธีนี้ใช้ 8 ไบต์<;._3~,~และใช้ตะขอแทนการจับคู่ขนาดกับตัวเองแล้วตัดและทำกล่องแต่ละกล่องเนื่องจากเมทริกซ์ของเมทริกซ์ได้รับอนุญาตเป็นเอาท์พุท
ไมล์

@miles ขอบคุณตอนนี้มันหรูหรามาก!
Galen Ivanov


2

เยลลี่ 5 ไบต์

Z⁹Ƥ⁺€

ใช้รูปแบบเอาต์พุต 4D สำหรับ 3D ให้ผนวก aสำหรับ6 ไบต์

ลองออนไลน์!

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

Z⁹Ƥ⁺€  Main link. Left argument: M (matrix). Right argument: n (integer)

 ⁹Ƥ    Apply the link to the left to all infixes of length n.
Z        Zip the rows of the infix, transposing rows and columns.
   ⁺€  Map Z⁹Ƥ over all results.

ฉันแนะนำสิ่งที่คล้ายกับ user202729 ในการแชท ทางเลือกที่ 5 byter ṡ€Zṡ€คือ
นาย Xcoder

2

Brachylogขนาด 13 ไบต์

{tN&s₎\;Ns₎}ᶠ

ลองออนไลน์!

ส่งคืนรายการของคอลัมน์

ในทางเทคนิคtN&s₎\;Ns₎เป็นภาคแสดงการสร้างซึ่งรวมเอาท์พุทของมันกับเมทริกซ์ย่อยใด ๆ เหล่านั้น เราใช้{…}ᶠเพื่อเปิดเผยความเป็นไปได้ทั้งหมดเท่านั้น

คำอธิบาย

 tN&              Call the second argument of the input N
{          }ᶠ     Find all:
    s₎              A substring of the matrix of size N
      \             Transpose that substring
       ;Ns₎         A substring of that transposed substring of size N

1

Stax , 10 ไบต์

│Æ☼♂Mqß E╖

เรียกใช้

การเป็นตัวแทน ASCII ของโปรแกรมเดียวกันคือ

YBFMyBF|PMmJ

มันใช้งานได้เช่นนี้

Y               Store the number in the y register
 B              Batch the grid into y rows each
  F             Foreach batch, run the rest of the program
   M            Transpose about the diagonal
    yB          Batch the transposed slices into y rows each
      F         Foreach batch, run the rest of the progoram
       |P       Print a blank line
         M      Transpose inner slice - restoring its original orientation
          mJ    For each row in the inner grid, output joined by spaces

1

JavaScript (ES6), 91 ไบต์

(a)(n)จะเข้าในไวยากรณ์ currying ส่งคืนผลลัพธ์เป็นรายการของแถว

a=>n=>(g=x=>a[y+n-1]?[a.slice(y,y+n).map(r=>r.slice(x,x+n)),...g(a[x+n]?x+1:!++y)]:[])(y=0)

กรณีทดสอบ


1

APL (Dyalog Classic) , 24 23 ไบต์

t∘↑¨(¯1-t←-2⍴⎕)↓,⍀⍪\⍪¨⎕

ลองออนไลน์!

ผลที่ได้คือเมทริกซ์ของเมทริกซ์ถึงแม้ว่าการจัดรูปแบบเอาต์พุตของ Dyalog ไม่ชัดเจนเท่าไหร่

ใส่เมทริกซ์ ( ) เปลี่ยนแต่ละองค์ประกอบให้เป็นเมทริกซ์ที่ซ้อนกันของมันเอง ( ⍪¨) ใส่คำนำหน้าเรียงต่อกันตามแถว ( ,\) และโดยคอลัมน์ ( ⍪⍀), ป้อน n ( ), วาง n-1 แถวแรกและคอลัมน์ของเมทริกซ์ซ้อน(¯1-t←-2⍴⎕)↓) ใช้มุมล่างขวา n-by-n จากแต่ละเมทริกซ์ ( t∘↑¨)

                                        ┌─┬──┬───┐
                                        aababc      ┼──┼───┤        ┼──┼───┤
 n=2       ┌─┬─┬─┐      ┌─┬──┬───┐      ├─┼──┼───┤      ababc        ab bc
┌───┐      abc      aabbac      aababc      dedef        de ef
abc  ⍪¨  ├─┼─┼─┤  ,\  ├─┼──┼───┤  ⍪⍀  ddedef 1 1 ┼──┼───┤¯2 ¯2∘↑¨┼──┼───┤
def ---> def ---> ddeedf ---> ├─┼──┼───┤ ---> ababc  --->       
ghi      ├─┼─┼─┤      ├─┼──┼───┤      aababc      dedef        de ef
└───┘      ghi      gghhgi      ddedef      ghghi        gh hi
           └─┴─┴─┘      └─┴──┴───┘      gghghi      ┴──┴───┘        ┴──┴───┘
                                        └─┴──┴───┘

0

Ruby , 63 ไบต์

->c,g{n=c.size-g+1
(0...n*n).map{|i|c[i/n,g].map{|z|z[i%n,g]}}}

ลองออนไลน์!

นี่คือแลมบ์ดาที่ใช้อาร์เรย์ 2 มิติและ int แล้วคืนค่าอาร์เรย์ 3 มิติ

Ungolfed:

->m,n{
  a = m.size - n + 1     # The count of rows in m that can be a first row in a submatrix
  (0...a*a).map{ |b|     # There will be a*a submatrices
    m[b/a,n].map{ |r|    # Take each possible set of n rows
      r[b%a,n]           # And each possible set of n columns
    }
  }
}

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