คำนวณเมทริกซ์จัตุรัสที่เหมาะสมที่สุด


13

เมทริกซ์ที่ดีที่สุด (สำหรับขอบเขตค่อนข้างแคบ ๆ ของความท้าทายนี้) จะได้รับโดย "ซิป" องค์ประกอบจากแถวที่สอดคล้องกันและคอลัมน์ของตารางเมทริกซ์และได้รับสูงสุดของแต่ละคู่

ตัวอย่างเช่นให้เมทริกซ์ต่อไปนี้:

4 5 6
1 7 2
7 3 0

คุณสามารถรวมมันเข้ากับ transpose เพื่อรับ: [[[4,5,6],[4,1,7]],[[1,7,2],[5,7,3]],[[7,3,0],[6,2,0]]]. [[(4,4),(5,1),(6,7)],[(1,5),(7,7),(2,3)],[(7,6),(3,2),(0,0)]]หากคุณซิปคู่ของรายการแต่ละท่านได้รับต่อไปนี้: ขั้นตอนสุดท้ายคือการรับค่าสูงสุดของแต่ละคู่เพื่อรับเมทริกซ์ที่ดีที่สุด:

4 5 7
5 7 3
7 3 0

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

การทดสอบ

[[172,29], [29,0]] -> [[172,29], [29,0]]
[[4,5,6], [1,7,2], [7,3,0]] -> [[4,5,7], [5,7,3], [7,3,0 ]]
[[1,2,3], [1,2,3], [1,2,3]] -> [[1,2,3], [2,2,3], [3,3,3 ]]
[[4,5, -6], [0,8, -12], [- 2,2,4]] -> [[4,5, -2], [5,8,2], [- 2,2,4]]

เราสามารถแสดงเมทริกซ์เวอร์ชันแบนได้หรือไม่? เช่น[1,2,3,4]แทน[[1,2],[3,4]]? จะช่วยประหยัด ~ 33%
กำจัด

คำตอบ:


7

เยลลี่ 2 ไบต์

»Z

ลองออนไลน์!

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

»Z  Main link. Argument: M (integer matrix)

 Z  Zip the rows of M, transposing rows and columns.
»   Take the maxima of all corresponding integers.

โอ้ ... ทำไมในโลกนี้มี»พฤติกรรมแบบนั้น!

5
พริตตี้มาตรฐานสำหรับภาษาการจัดการอาร์เรย์ อ็อกเทฟก็maxทำเช่นเดียวกัน
Dennis

5

Haskell , 40 ไบต์

z(z max)<*>foldr(z(:))e
e=[]:e
z=zipWith

ลองออนไลน์!

ฉันจะถอดคำนี้ออกเป็น:

import Data.List
f m = zipWith (zipWith max) m (transpose m)

... ซึ่งงดงามกว่านี้มาก


2
ฉันคิดว่ามันตลกที่สิ่งที่ดีที่สุดที่ฉันสามารถเล่นกอล์ฟใน Clean ได้นั้นเหมือนกับ Haskell ที่ไม่ได้รับการอวดของคุณ
Janurous





2

JavaScript (ES6), 48 ไบต์

m=>m.map((r,y)=>r.map((v,x)=>v>(k=m[x][y])?v:k))

กรณีทดสอบ


2

J , 4 ไบต์

ฟังก์ชั่นนำหน้า Tacit

>.|:

ลองออนไลน์!

>. เพดาน [ของอาร์กิวเมนต์] ด้วย

|: อาร์กิวเมนต์ transposed


f=:อืมผมไม่คิดว่าคุณต้องรวม : P ในตอนแรกฉันคิดว่าคุณลดจำนวน bytec ลง 3 bytes ...
Erik the Outgolfer

<.ควรจะเป็น>.
FrownyFrog

@FrownyFrog แน่นอน
Adám

@EriktheOutgolfer ไม่ฉันไม่
Adám


1

CJam , 8 ไบต์

{_z..e>}

บล็อกนิรนาม (ฟังก์ชัน) ที่รับอินพุตจากสแต็กและแทนที่ด้วยเอาต์พุต

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

{      }    e# Define block
 _          e# Duplicate
  z         e# Zip
   .        e# Apply next operator to the two arrays, item by item
            e# (that is, to rows of the two matrices)
    .       e# Apply next operator to the two arrays, item by item
            e# (that is, to numbers of the two rows)
     e>     e# Maximum of two numbers

1

R , 23 ไบต์

function(A)pmax(A,t(A))

ลองออนไลน์!

นี่เทียบเท่ากับคำตอบอื่น ๆ ส่วนใหญ่ อย่างไรก็ตาม R มีmaxฟังก์ชั่นที่แตกต่างกันสองอย่างสำหรับสถานการณ์ทั่วไปสองแบบ:

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

pmaxและpminใช้เวกเตอร์หนึ่งตัวหรือมากกว่านั้น (หรือเมทริกซ์) เป็นอาร์กิวเมนต์และส่งคืนเวกเตอร์เดียวที่ให้ค่าสูงสุด 'ขนาน' (หรือค่าต่ำสุด) ของเวกเตอร์ องค์ประกอบแรกของผลลัพธ์คือค่าสูงสุด (ขั้นต่ำ) ขององค์ประกอบแรกของอาร์กิวเมนต์ทั้งหมดองค์ประกอบที่สองของผลลัพธ์คือค่าสูงสุด (ขั้นต่ำ) ขององค์ประกอบที่สองของอาร์กิวเมนต์ทั้งหมดและอื่น ๆ อินพุตที่สั้นกว่า (ความยาวไม่เป็นศูนย์) จะถูกนำกลับมาใช้ใหม่หากจำเป็น



1

C (gcc) , 79 77 ไบต์

  • ที่บันทึกไว้สองไบต์ขอบคุณที่Steadybox ; รับพารามิเตอร์เมทริกซ์หนึ่งพารามิเตอร์เท่านั้นเนื่องจากเมทริกซ์ทั้งหมดในความท้าทายนี้คือกำลังสอง
j,i;f(A,n)int*A;{for(j=0;j<n*n;j++)printf("%d,",A[A[j]>A[i=j/n+j%n*n]?j:i]);}

ลองออนไลน์!

ใช้อาร์เรย์จำนวนเต็มแบบเรียบAและมิติเมทริกซ์n(เนื่องจากเมทริกซ์ต้องเป็นสี่เหลี่ยมจัตุรัส) เป็นอินพุต แสดงเอาต์พุตสตริงอาร์เรย์จำนวนเต็มแบบแบนไปที่ stdout








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