นำเมทริกซ์มารวมกับผลรวม


23

ท้าทาย:

ให้เมทริกซ์อินพุตจตุรัสAให้เลื่อนเมทริกซ์ด้วยหนึ่งแถวและหนึ่งคอลัมน์ในทั้งสี่ด้าน

  • ค่าของแต่ละองค์ประกอบในแถวบนและล่างควรเป็นผลรวมขององค์ประกอบในแต่ละคอลัมน์ที่เกี่ยวข้อง
  • ค่าของแต่ละองค์ประกอบในคอลัมน์ซ้ายและขวาควรเป็นผลรวมขององค์ประกอบในแต่ละแถวที่เกี่ยวข้อง
  • ค่าขององค์ประกอบในมุมบนซ้ายและมุมขวาล่างควรเป็นผลรวมขององค์ประกอบในแนวทแยงมุม
  • ค่าขององค์ประกอบที่มุมบนขวาและมุมซ้ายล่างควรเป็นผลรวมขององค์ประกอบในแนวต้าน

ตัวอย่าง:

A = 
1   5   3
3   2   4
2   5   5

Output:
 8    6   12   12    7
 9    1    5    3    9
 9    3    2    4    9
12    2    5    5   12
 7    6   12   12    8

คำอธิบาย:

ด้านบนซ้ายและองค์ประกอบด้านล่างขวาเป็นผลรวมของเส้นทแยงมุม1 + 2 + 5 = 8 องค์ประกอบด้านบนขวาและซ้ายล่างคือผลรวมของการต้านเส้นทแยงมุม2 + 2 + 3 = 7 7

ด้านบนและด้านล่างแถว (ยกเว้นมุม) เป็นผลรวมของแต่ละคอลัมน์ใน: 1 + 3 + 2 = 6 , 5 + 2 + 5 = 12และ3 + 4 + 5 = 12 ในทำนองเดียวกันคอลัมน์ด้านซ้ายและขวา (ยกเว้นมุม) เป็นผลรวมของแต่ละแถวของ: 1 + 5 + 3 = 9 , 3 + 2 + 4 = 9และ2 + 5 + 5 = 12

การป้อนข้อมูล:

  • เมทริกซ์จตุรัสที่ว่างเปล่าที่มีจำนวนเต็มไม่เป็นลบ
  • รูปแบบเพิ่มเติม

เอาท์พุท:

  • เมทริกซ์เบาะตามที่อธิบายไว้ข้างต้น
  • รูปแบบเพิ่มเติม แต่ต้องเป็นรูปแบบอินพุต

กรณีทดสอบ:

ใช้ผลงานที่ส่งมาในการท้าทายนี้หากคุณต้องการแปลงรูปแบบการป้อนข้อมูลให้เป็นแบบที่เหมาะสมกว่า (เช่น[[1, 5],[0, 2]])

0
----------------
0 0 0
0 0 0
0 0 0

1 5
0 2
----------------
3 1 7 5
6 1 5 6
2 0 2 2
5 1 7 3

17   24    1    8   15
23    5    7   14   16
 4    6   13   20   22
10   12   19   21    3
11   18   25    2    9 
----------------
65   65   65   65   65   65   65
65   17   24    1    8   15   65
65   23    5    7   14   16   65
65    4    6   13   20   22   65
65   10   12   19   21    3   65
65   11   18   25    2    9   65
65   65   65   65   65   65   65

15    1    2   12
 4   10    9    7
 8    6    5   11
 3   13   14    0
----------------
30   30   30   30   30   30
30   15    1    2   12   30
30    4   10    9    7   30
30    8    6    5   11   30
30    3   13   14    0   30
30   30   30   30   30   30

นี่คือดังนั้นทางออกที่สั้นที่สุดในแต่ละภาษาชนะ คำอธิบายได้รับการสนับสนุนอย่างมาก


2
นั่นคือการตรวจสอบสแควร์สเวทมนตร์?
mdahmoune

การตรวจสอบง่ายขึ้นนิดหน่อย แต่จริง ๆ แล้วมันง่ายที่จะดูว่าสแควร์เป็นเวทย์มนตร์ด้วยวิธีนี้ใช่ :-)
Stewie Griffin

คำตอบ:


5

เสียงคู่แปดฟ 64 ไบต์

ขอบคุณ Tom Carpenter สำหรับการบันทึกทั้ง 4 ไบต์และแก้ไขข้อผิดพลาดที่ฉันมีในรหัสต้นฉบับ!

@(a)[b=(t=@trace)(a),c=sum(a),d=t(flip(a));z=sum(a,2),a,z;d,c,b]

ลองออนไลน์!

คำอธิบาย:

@(a)                 % Anonymous function that takes the matrix 'a' as input
 [ ... ]             % Concatenate everything inside to a single matrix
  b=(t=@trace)(a),   % Clever trick by Tom Carpenter. Save a function handle 
                     % for 't=trace', and call it with 'a' as input
                     % Save the result in the variable 'b'
  c=sum(a)           % Sum of all columns of 'a'
  d=t(flip(a));      % Save the trace of 'a' flipped as a variable 'd', while 
                     % concatenating [b,c,d] horizontally at the same time, creating the 
                     % first row of the output
  z=sum(a,2)         % The sum of each row of the input, and store it in a variable 'z'
  ,a,z;              % Concatenate it with 'a' and 'z' again, to create the middle part of the output
 d,c,b]              % Add [d,c,b] to complete the bottom row

หมายเหตุฉันเขียนมานานหลังจากที่ฉันโพสต์ความท้าทาย


4

เยลลี่ , 27 ไบต์

,UŒDḢ$S$€,Ṛ$j€SW€jSẋ¥€2$j"$

ลองออนไลน์!


2
ฉันต้องการทราบวิธีการทำงานของโปรด
สหาย SparklePony

@ComradeSparklePony ฉันไม่รู้ว่าฉันมีเวลาเขียนคำอธิบายตอนนี้ขอโทษ
Erik the Outgolfer

ไม่เป็นไรไม่ต้องกังวล
สหาย SparklePony

4

MATL , 27 26 ไบต์

,!tXswyv]GXds5L(PGPXds5L(P

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

คำอธิบาย

,        % Do the following twice
  !      %   Tranpose. Takes input implititly in the first iteration
  t      %   Duplicate
  Xs     %   Row vector with the sum of each column
  wy     %   Push a copy to the bottom of the stack
  v      %   Concatenate stack vertically. This attaches the sum of
         %   each row (first iteration) and column (second), leaving 
         %   the matrix with the correct orientation (transposed twice)
]        % End
G        % Push input again
Xds      % Column vector with the diagonal of the matrix. Sum of vector
5L(      % Write that into first and last entries of the result matrix
         % matrix; that is, its upper-left and lower-right corners
P        % Flip result matrix vertically
GP       % Push input matrix vertically flipped
Xds      % Diagonal, sum. Since the input has been vertically flipped,
         % this gives the sum of the anti-diagonal of the input.
5L(      % Write that into the upper-left and lower-right corners of
         % the verticallly flipped version of the result matrix
P        % Flip vertically again, to restore initial orientation
         % Implicitly display

แน่นอนว่า MATL ได้รับการออกแบบให้ทำงานกับเมทริกซ์ซึ่งไม่เหมือนเจลลี่ > _>
Erik the Outgolfer

@EriktheOutgolfer แต่คำตอบของคุณมียูโรเพิ่ม!
Luis Mendo

3
ใช่มันมียูโรดอลล่าร์และเยนส์ ... น่าเสียดายที่นั่นไม่ใช่เกณฑ์การชนะที่นี่ D:
Erik the Outgolfer

3

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

(d,+⌿,d∘⌽)⍪(+/,⊢,+/)⍪d∘⌽,+⌿,d←+/1 1∘⍉

ลองออนไลน์!

1 1∘⍉ ทแยงมุม (จุดไฟยุบแกนทั้งสองเป็นหนึ่งเดียว)

d← เก็บฟังก์ชันนั้นเป็นdและใช้กับอาร์กิวเมนต์

+⌿ เติมผลรวมของคอลัมน์

d∘⌽, prepend dนำไปใช้กับอาร์กิวเมนต์ที่กลับรายการ

(... จัด)⍪ วางสิ่งต่อไปนี้ไว้ด้านบน:

+/,⊢,+/ ผลรวมของแถว, อาร์กิวเมนต์ที่ไม่ได้แก้ไข, ผลรวมของแถว

(... จัด)⍪ วางสิ่งต่อไปนี้ไว้ด้านบน:

d,+⌿,d∘⌽ นำไปใช้กับอาร์กิวเมนต์ผลรวมคอลัมน์dนำไปใช้กับอาร์กิวเมนต์ที่กลับรายการ


3

เยลลี่ 26 ไบต์

ŒDµḊṖѵ€1¦ŒḌU
S;;S
Ç€Zµ⁺ÑÑ

ลองออนไลน์!

ดูแปลกใจแตกต่างจากโซลูชันของ Erikวิธีการแก้ปัญหาของเอริค

ในที่สุดฉันก็สามารถเข้าใจวิธีการ¦ทำงาน (โดยการดีบักผ่านรหัสของ Jelly, lol) น่าเสียดายที่มันต้องมีการทำงานกับÇในกรณีของฉัน

คำอธิบาย

รหัสใช้สามลิงก์ ลิงก์ตัวช่วยแรกจะรวมเวกเตอร์กับทั้งสองด้านส่วนลิงค์ตัวช่วยตัวที่สองจะแก้ไขสองมุมของเมทริกซ์และลิงก์หลักจะเรียกสิ่งเหล่านี้อย่างเหมาะสม

Ç€Zµ⁺ÑÑ    Main link. Argument: M (matrix)
Ç            Call the first helper link (pad row with sums)...
 €           ...on each row of the matrix.
  Z          Transpose, so that the second invocation uses the columns.
   µ         Begin a new monadic chain.
    ⁺        Repeat the previous chain (everything up to here).
     ÑÑ      Call the second helper link twice on the whole matrix.

S;;S    First helper link. Argument: v (1-dimensional list)
S         Sum the argument list.
 ;        Append the argument list to the sum.
  ;       Append...
   S      ...the sum of the argument list.

ŒDµḊṖѵ€1¦ŒḌU    Second helper link. Argument: M (matrix)
ŒD                 Get the diagonals of the matrix, starting with the main diagonal.
  µ                Begin a new monadic chain.
      µ€           Perform the following actions on each diagonal...
        1¦         ...and keep the result for the first item (main diagonal):
   Ḋ                 Remove the first item (incorrect top corner).
    Ṗ                Remove the last item (incorrect bottom corner).
     Ñ               Call the first helper link on the diagonal to pad it with its sum.
          ŒḌ       Convert the diagonals back to the matrix.
            U      Reverse each row, so that consecutive calls fix the other corners.

3

Python 3 , 155 ไบต์

นี่คือคำแนะนำของ @LeakyNun ซึ่งจะช่วยประหยัด54 ไบต์ จากนั้นฉันก็ตีกอล์ฟเอง

def f(m):l=len(m);r=range(l);s=sum;b=[s(m[i][i]for i in r)];c=[s(m[i][l+~i]for i in r)];d=[*map(s,zip(*m))];return[b+d+c,*[[s(a),*a,s(a)]for a in m],c+d+b]

ลองออนไลน์!

วิธีแก้ปัญหาเบื้องต้น - Python 3 , 216 ไบต์

def f(m):l=len(m);r,s=range(l),sum;a,b,c,d=s(m[i][i]for i in r),s(m[i][l-i-1]for i in r),[s(m[i][j]for j in r)for i in r],[s(m[i][j]for i in r)for j in r];print([[a]+d+[b]]+[[c[i]]+m[i]+[c[i]]for i in r]+[[b]+d+[a]])

ลองออนไลน์!



@LeakyNun ขอบคุณ เพิ่งได้รับการอัปเดตด้วยขนาด 190 ไบต์ซึ่งสั้นกว่ามาก: P
Mr. Xcoder

2

Python 2 , 268 250 184 174 ไบต์

10 ขอบคุณ Stewie Griffin

from numpy import *
a,c,v,s=sum,trace,vstack,matrix(input())
l,r,d,e=a(s,0),a(s,1),c(s),c(fliplr(s))
print hstack((v(([[d]],r,[[e]])),v((l,s,l)),v(([[e]],r,[[d]])))).tolist()

ลองออนไลน์!

คำอธิบายบางอย่าง อินพุตถูกอัพโหลดเป็นเมทริกซ์ อันดับแรกรหัสจะคำนวณผลรวมของแต่ละคอลัมน์และแต่ละแถวโดยใช้ numpy.sum จากนั้นมันคำนวณผลรวมของเส้นทแยงมุมโดย numpy.trace หลังจากนี้มันจะได้เส้นทแยงมุมอื่น ๆ โดยการพลิกซ้ายขวาบนเมทริกซ์ ในที่สุดมันใช้ numpy.vstack และ numpy.hstack เพื่อกาวชิ้นด้วยกัน


@StewieGriffin ตกลงฉันเพิ่งอัปเดตโค้ด :)
mdahmoune

1
ฉันเชื่อว่าสิ่งนี้ใช้ได้กับ 174 tio.run/…
Stewie Griffin

2

R, 129 ไบต์

pryr::f(t(matrix(c(d<-sum(diag(m)),c<-colSums(m),a<-sum(diag(m[(n<-nrow(m)):1,])),t(matrix(c(r<-rowSums(m),m,r),n)),a,c,d),n+2)))

ฟังก์ชันที่ไม่ระบุชื่อที่รับเมทริกซ์จตุรัสเป็นอินพุต ฉันจะโพสต์คำอธิบายหากมีความสนใจ


2

PHP , 211 ไบต์

<?foreach($_GET as$l=>$r){$y=0;foreach($r as$k=>$c){$y+=$c;$x[$k]+=$c;$l-$k?:$d+=$c;($z=count($_GET))-1-$k-$l?:$h+=$c;}$o[]=[-1=>$y]+$r+[$z=>$y];}$o[]=[-1=>$h]+$x+[$z=>$d];print_r([-1=>[-1=>$d]+$x+[$z=>$h]]+$o);

ลองออนไลน์!

ขยาย

foreach($_GET as$l=>$r){
  $y=0; # sum for a row
  foreach($r as$k=>$c){
    $y+=$c; # add to sum for a row
    $x[$k]+=$c; # add to sum for a column and store in array
    $l-$k?:$d+=$c; # make the diagonal sum left to right
    ($z=count($_GET))-1-$k-$l?:$h+=$c; # make the diagonal sum right to left
  }
  $o[]=[-1=>$y]+$r+[$z=>$y]; # add to result array the actual row with sum of both sides
}
$o[]=[-1=>$h]+$x+[$z=>$d]; # add to result array the last array
print_r([-1=>[-1=>$d]+$x+[$z=>$h]]+$o); #output after adding the first array to the result array

2

Python 3 , 125 ไบต์

from numpy import*
f=lambda m,t=trace,s=sum:c_[r_[t(m),s(m,1),t(m[::-1])],c_[s(m,0),m.T,s(m,0)].T,r_[t(m[::-1]),s(m,1),t(m)]]

ลองออนไลน์!

ungolfed เล็กน้อย:

import numpy as np

def f_expanded(m):
    return np.c_[np.r_[np.trace(m), np.sum(m, 1), np.trace(m[::-1])],
                 np.c_[np.sum(m, 0), m.T, np.sum(m, 0)].T,
                 np.r_[np.trace(m[::-1]), np.sum(m, 1), np.trace(m)]]

สิ่งนี้ใช้รูปแบบอินพุตเป็นอาร์เรย์ numpy จากนั้นใช้เครื่องมือทำดัชนีnp.c_และnp.r_สร้างอาร์เรย์ใหม่ในครั้งเดียว np.traceและnp.sumใช้ในการคำนวณผลรวมตามแนวทแยงมุมและที่อื่นตามลำดับTจะใช้ในการใช้ transpose ก่อนและหลังการเชื่อมโยงเงินก้อนเพราะมันสั้นกว่าทำให้อาร์เรย์ทั้งหมด 2 np.r_มิติและการใช้ m[::-1]บันทึกไบต์เมื่อเปรียบเทียบกับrot90(m)หรือfliplr(m)สำหรับการค้นหาร่องรอยสำหรับเส้นทแยงมุมที่สอง


คำตอบที่ดี! ยินดีต้อนรับสู่เว็บไซต์ :)
DJMcMayhem

1

JavaScript (ES6), 170 ไบต์

(a,m=g=>a.map((_,i)=>g(i)),s=x=>eval(x.join`+`))=>[[d=s(m(i=>a[i][i])),...c=m(i=>s(m(j=>a[j][i]))),g=s(m(i=>a[i][a.length-i-1]))],...a.map(b=>[r=s(b),...b,r]),[g,...c,d]]

อินพุตและเอาต์พุตเป็นอาร์เรย์ตัวเลข 2 มิติ

อธิบาย

(a,                             // input matrix: a
    m=g=>a.map((_,i)=>g(i)),    // helper func m: map by index
    s=x=>eval(x.join`+`)        // helper func s: array sum
) =>
[
    [
        d = s(m(i=>a[i][i])),           // diagonal sum: d
        ...c=m(i=>s(m(j=>a[j][i]))),    // column sums: c
        g = s(m(i=>a[i][a.length-i-1])) // antidiagonal sum: g
    ],
    ...a.map(b=>[r = s(b), ...b, r]),   // all rows with row sums on each end
    [g, ...c, d]                        // same as top row, with corners flipped
]

ตัวอย่างการทดสอบ

อินพุต / เอาต์พุตถูกจัดรูปแบบด้วยบรรทัดใหม่และแท็บ

f=
(a,m=g=>a.map((_,i)=>g(i)),s=x=>eval(x.join`+`))=>[[d=s(m(i=>a[i][i])),...c=m(i=>s(m(j=>a[j][i]))),g=s(m(i=>a[i][a.length-i-1]))],...a.map(b=>[r=s(b),...b,r]),[g,...c,d]]

let tests=[[[0]],[[1,5],[0,2]],[[17,24,1,8,15],[23,5,7,14,16],[4,6,13,20,22],[10,12,19,21,3],[11,18,25,2,9]],[[15,1,2,12],[4,10,9,7],[8,6,5,11],[3,13,14,0]]];
<select id=S oninput="I.value=S.selectedIndex?tests[S.value-1].map(s=>s.join`\t`).join`\n`:''"><option>Tests<option>1<option>2<option>3<option>4</select> <button onclick="O.innerHTML=I.value.trim()?f(I.value.split`\n`.map(s=>s.trim().split(/\s+/g))).map(s=>s.join`\t`).join`\n`:''">Run</button><br><textarea rows=6 cols=50 id=I></textarea><pre id=O>


0

โลโก้ , 198 ไบต์

to g :v[:h reduce "+ :v]
op(se :h :v :h)
end
to f :s[:a reduce "+ map[item # ?]:s][:b reduce "+ map[item # reverse ?]:s][:c apply "map se "sum :s]
op `[[,:a ,@:c ,:b],@[map "g :s][,:b ,@:c ,:a]]
end

ฟังก์ชั่นfใช้เวลาในเมทริกซ์เป็นรายการ 2D จากนั้นส่งออกเมทริกซ์ที่เกิดขึ้น gเป็นฟังก์ชั่นผู้ช่วย

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