สร้างเมทริกซ์ซิกแซกใหม่


18

ในฐานะที่เป็นส่วนหนึ่งของอัลกอริธึมการบีบอัดมาตรฐาน JPEG จะเปิดใช้งานเมทริกซ์เป็นเวกเตอร์ตามแนวต้านของทิศทางสลับ:

ป้อนคำอธิบายรูปภาพที่นี่

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

[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3], 4, 3

ควรให้ผลผลิต

[1 2 3 4
 5 6 7 8
 9 1 2 3]

ในขณะที่ขนาด6, 2จะให้

[1 2 6 3 1 2
 5 9 4 7 8 3]

กฎระเบียบ

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

10คุณอาจจะคิดว่าองค์ประกอบเวกเตอร์เป็นจำนวนเต็มบวกน้อยกว่า

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

เวกเตอร์อินพุตอาจได้รับในรูปแบบลิสต์แบบแบนหรือแบบสตริง

เมทริกซ์เอาต์พุตอาจอยู่ในรูปแบบรายการหรือรูปแบบสตริงที่สะดวกไม่คลุมเครือซ้อนกันหรือเป็นรายการแบบแบนพร้อมกับมิติเมทริกซ์ทั้งสอง (หรือแน่นอนว่าเป็นเมทริกซ์หากภาษาของคุณมี)

ใช้กฎมาตรฐานของ

กรณีทดสอบ

vector width height => matrixกรณีทดสอบแต่ละคนจะอยู่ในรูป

[1] 1 1                        => [[1]]
[1 2 3 1] 2 2                  => [[1 2] [3 1]]
[1 2 3 1] 4 1                  => [[1 2 3 1]]
[1 2 5 9 6 3 4 7 1 2 8 3] 3 4  => [[1 2 3] [5 6 4] [9 7 8] [1 2 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 4 3  => [[1 2 3 4] [5 6 7 8] [9 1 2 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 6 2  => [[1 2 6 3 1 2] [5 9 4 7 8 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 12 1 => [[1 2 5 9 6 3 4 7 1 2 8 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 1 12 => [[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]]

ความท้าทายที่เกี่ยวข้อง

คำตอบ:


7

เยลลี่, 18 13 ไบต์

pS€żị"¥pỤỤị⁵s

รับจำนวนแถวจำนวนคอลัมน์และรายการแฟล็กเป็นอาร์กิวเมนต์บรรทัดคำสั่งที่แยกต่างหาก

รหัสของฉันเกือบจะเหมือนกับหนึ่งในความท้าทายคู่ที่ ความแตกต่างเพียงอย่างเดียวคือส่วนเพิ่มเติม(ซึ่งกลับการเปลี่ยนแปลงของดัชนี) และs(เพื่อแยกเอาท์พุทเป็นอาร์เรย์ 2D)

ลองออนไลน์!


4

MATL , 29 ไบต์

:!i:+-1y^8MtsQ/*-X:4#S2$S1GZC

ป้อนข้อมูลheight, width, vectorคั่นด้วยการขึ้นบรรทัดใหม่

นี้เป็นส่วนหนึ่งของ reuses รหัสในคำตอบของฉันกับความท้าทายที่เกี่ยวข้อง

ลองออนไลน์!

คำอธิบาย

:!      % take number of rows, r, as input. Generate column vector [1;2;...;r]
i:      % take number of columns, c, as input. Generate row vector [1,2,...,c] 
+       % add with broadcast. Gives 2D array
-1      % push -1
y^      % duplicate previous 2D array. Compute -1 raised to that
8M      % push [1;2;...;r] again
tsQ/    % divide by its sum plus 1
*       % multiply
-       % subtract
X:      % linearize 2D array into column array
4#S     % sort and push the indices of the sorting. Gives a column vector
2$S     % take vector as input. Sort it according to previous column vector
1G      % push r
ZC      % reshape into columns of r elements

0

J, 24 ไบต์

]$({~[:/:@;[:<@|.`</.i.)

นอกจากนี้ยังใช้คำวิเศษณ์เอียง/.ที่จะดำเนินการเช่นเดียวกับใน zigzagify เจคำตอบจากที่ท้าทาย

การใช้

อินพุตอยู่กับอาเรย์บน LHS และขนาด[height, width]ของ RHS

   f =: ]$({~[:/:@;[:<@|.`</.i.)
   1 f 1 1
1
   1 2 3 1 f 2 2
1 2
3 1
   1 2 5 9 6 3 4 7 1 2 8 3 f 4 3
1 2 3
5 6 4
9 7 8
1 2 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 3 4
1 2 3 4
5 6 7 8
9 1 2 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 2 6
1 2 6 3 1 2
5 9 4 7 8 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 1 12
1 2 5 9 6 3 4 7 1 2 8 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 12 1
1
2
5
9
6
3
4
7
1
2
8
3

คำอธิบาย

]$({~[:/:@;[:<@|.`</.i.)  Input: list A (LHS), dimensions D (RHS)
                     i.   Range shaped to D
           [:<@|.`</.     Zigzagify that matrix
     [:   ;               Raze the boxes to get a zigzagify permutation
       /:@                Invert that permutation to get an unzigzagify permutation
   {~                     Apply that permutation to A
]                         Get D
 $                        Shape that permutation to D and return
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.