รวมเส้นทแยงมุม


19

ใช้เมทริกซ์ของจำนวนเต็มบวกเป็นอินพุตและส่งออกผลรวมแต่ละองค์ประกอบบนเส้นทแยงมุมผ่านเมทริกซ์

คุณจะต้องนับเฉพาะเส้นที่ลงตามแนวทแยงมุมและไปทางขวาเท่านั้น คุณต้องเริ่มต้นด้วยเส้นทแยงมุมที่มีเฉพาะองค์ประกอบด้านล่างซ้ายจากนั้นเส้นทแยงมุมสองความยาวด้านบนนั้น (ถ้ามี) และต่อไปจนถึงเส้นทแยงมุมที่มีเฉพาะองค์ประกอบด้านบนขวาดังแสดงด้านล่าง

ตัวอย่าง:

Input:
 8   14    5    1
10    5    5    8
 6    6    8   10
15   15    4   11

Output:
15, 21, 20, 32, 29, 13, 1
(Diagonals: {{15},{6,15},{10,6,4},{8,5,8,11},{14,5,10},{5,8},{1}})

Input:
1
Output:
1

Input: 
1 5
Output:
1, 5

Input:
4
1

Output: 
1, 4

Input:
17    4    5
24   16    5
 9   24   10
 1   14   22
 1   21   24
 4    4   17
24   25   17

Output:
24, 29, 22, 39, 47, 70, 43, 9, 5

รูปแบบอินพุตและเอาต์พุตเป็นทางเลือกเช่นเคย

นี่คือดังนั้นการส่งสั้นที่สุดในแต่ละภาษาชนะ


คำตอบ:


6

Haskell , 40 37 ไบต์

z=0:z
foldl1$(.(++z)).zipWith(+).(0:)

ลองออนไลน์! การใช้งาน: (foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]].

แก้ไข:ขอบคุณØrjan Johansen สำหรับ -3 ไบต์!

Ungolfed:

z = 0:z
s#t = zipWith(+)(0:s)(t++z)
f m = foldl1 (#) m

zเป็นรายการของศูนย์จำนวนมากอย่างไม่มีที่สิ้นสุด ในfเราพับรายการของรายการโดยการรวมสองรายการที่มีฟังก์ชั่นm #ใน#รายการแรกsมีจำนวนคอลัมน์สะสมจนถึงขณะนี้และรายการที่สองtคือแถวใหม่ที่ควรเพิ่ม เราเปลี่ยนsองค์ประกอบหนึ่งไปทางขวาโดยการเพิ่มศูนย์ให้ด้านหน้าและองค์ประกอบที่ชาญฉลาดเพิ่มsและมีt zipWith(+)เพราะsอาจจะมีขนาดใหญ่โดยพลเรามีแผ่นด้วยศูนย์เพียงพอโดยท้ายtz


foldl1$(.(++z)).zipWith(+).(0:)นั่นเป็นจุดที่สั้นฟรี:
Ørjan Johansen

6

Mathematica, 53 54 ไบต์

l=Length@#-1&;Tr@Diagonal[#,k]~Table~{k,-l@#,l@#&@@#}&

ฟังก์ชั่นที่บริสุทธิ์รับอาร์เรย์ 2D เป็นอินพุตและส่งคืนรายการ (รายการไม่จำเป็นต้องเป็นจำนวนเต็มหรือตัวเลข) Diagonal[#,k]ส่งกลับค่าkเส้นทแยงมุม th ด้านบน (หรือด้านล่างหากkเป็นลบ) เส้นทแยงมุมหลัก {k,-l@#,l@#&@@#}คำนวณช่วงของเส้นทแยงมุมที่จำเป็นตามขนาดของอาร์เรย์อินพุต และTrสรุปรายการของแต่ละเส้นทแยงมุม


ทางเลือกที่นับไบต์เดียวกัน แต่บางทีคุณสามารถตีกอล์ฟเพิ่มเติมได้หรือไม่ วงเล็บเหล่านั้นดูไม่ดี Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
Martin Ender

5

MATL , 6 ไบต์

T&XdXs

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

คำอธิบาย

T&Xd   % All diagonals of implicit input arranged as zero-padded columns
Xs     % Sum of each column. Implicitly display

แค่อยากรู้: คุณคิดว่ามันจะเป็นการดีกว่าโดยรวมs==sum(x(:))แทนที่จะเป็นไปตามแบบแผน MATLAB เหมือนที่ MATLAB ทำ
Stewie Griffin

@StewieGriffin บางครั้งฉันก็คิดเรื่องนั้น ข้อสงสัยของฉันเป็นมากขึ้นระหว่างและsum(x) sum(x,1)สำหรับเมทริกซ์xความจริงที่sum(x)ทำงานแตกต่างกันถ้าเมทริกซ์มี 1 แถวบางครั้งก็น่ารำคาญ แต่ในที่สุดฉันก็ตัดสินใจที่จะใช้ Matlab ดังนั้นทั้งสองภาษาจึงเข้าใกล้ และเพิ่มfun(x,1)ฟังก์ชันบางอย่างสำหรับกรณีที่พบบ่อยที่สุด
Luis Mendo

5

เยลลี่ 5 ไบต์

0;+µ/

ลองออนไลน์!

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

0;+µ/  Main link. Argument: M (matrix / array of rows)

   µ   Combine all links to the left into a chain (arity unknown at parse time) and
       begin a new monadic chain.
    /  Reduce M by that chain. This makes the chain dyadic.
       Let's call the arguments of the chain L and R (both flat arrays).
0;         Prepend a 0 to L.
  +        Perform element-wise addition of the result and R.
           When the chain is called for the n-th time, R has n less elements, so
           the last n elements of L won't have matching elements in R and will be
           left unaltered.

เฉพาะ R แรกที่จะลดมีองค์ประกอบที่น้อยกว่าหนึ่งรายการ มันเพิ่มองค์ประกอบอีกหนึ่งรายการในแต่ละแถว
Ørjan Johansen

นี่มันฉลาดแค่ ... ไม่ŒDเหรอ?
Erik the Outgolfer

@EriktheOutgolfer การŒDสั่งซื้อแปลก ๆอีกครั้งทำให้ไม่สามารถใช้ประโยชน์ได้
Dennis

@Dennis แล้วฉันคิดว่าฉันทำอะไรบางอย่างที่ไม่ได้มีการสั่งซื้อแปลก ... โอ้อาจจะ 3 monads อาจจะเข้ามา
Erik the Outgolfer

5

JavaScript (ES6), 65 58 ไบต์

a=>a.map(b=>b.map((c,i)=>r[i]=~~r[i]+c,r=[,...r]),r=[])&&r

ตัวแปร 63 ไบต์:a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
Arnauld

@Arnauld ฉันเห็นด้วยการย้อนกลับเป็นไปไม่ดี แต่ความยาวก็ยาวเกินไปเช่นกัน!
Neil

3

CJam , 22 21 ไบต์

บันทึก 1 ไบต์ขอบคุณ Martin Ender

{_,({0\f+}*ee::m<:.+}

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

ลองออนไลน์!

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

_                   e# Duplicate the matrix
 ,(                 e# Get its length (# of rows) minus 1
   {0\f+}*          e# Prepend that many 0s to each row
          ee        e# Enumerate; map each row to [index, row]
            ::m<    e# Rotate each row left a number of spaces equal to its index
                :.+ e# Sum each column

2

05AB1E , 17 ไบต์

Rvy¹gÅ0«NFÁ}})øO¨

ลองออนไลน์!

คำอธิบาย

R                  # reverse input
 v                 # for each N,y (index, item)
  y¹gÅ0«           # pad y with as many zeroes as the number of rows in the input
        NFÁ}       # rotate each row N times right
            })     # wrap the result in a list
              øO   # sum the columns
                ¨  # remove the last element of the resulting list (the padded zeroes)

2

J , 7 ไบต์

+//.@|.

ลองออนไลน์!

มันค่อนข้างง่าย:

+//.@|.
+/        sum
  /.      on oblique lines
    @|.   on the reversed array

เส้นตรงข้ามนั้นคือเส้นทแยงมุมของอาเรย์ดังนั้นนี่จึงเป็นเพียงการสรุปเส้นทแยงมุม



1

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

ŒDS€ṙZL$

ลองออนไลน์!

ครึ่งหนึ่งของรหัสถูกใช้เพื่อวางผลลัพธ์ลงในลำดับที่ถูกต้อง

อย่างไร?

ŒDS€ṙZL$ - Main link: list of lists of numbers
ŒD       - diagonals (starts with the diagonal containing the top left element,
         -            then the next diagonal to the right, and so on wrapping around)
  S€     - sum €each
       $ - last two links as a monad
     Z   - transpose the matrix
      L  - length (width of the matrix)
    ṙ    - rotate the results left by that amount


1

R, 45 ไบต์

ฟังก์ชั่นที่ไม่มีชื่อการใช้วัตถุเมทริกซ์คลาสเป็นอินพุต:

function(x)sapply(split(x,col(x)-row(x)),sum)

การใช้ความคิดที่อธิบายไว้ใน นี้คำตอบ


ฉันเชื่อว่ากฎในการท้าทายนี้ช่วยให้คุณสามารถกำจัดการโทรออกได้unnameแต่นี่เป็นทางออกที่ยอดเยี่ยมโดยไม่คำนึงถึง!
Giuseppe

1

ระดับแปดเสียง 71 ไบต์

สมมติว่า A เป็นเมทริกซ์ตัวอย่างเช่น:

A = [17 4 5;24 16 5; 9 24 10; 1 14 22; 1 21 24; 4 4 17;24 25 17];

จากนั้นเรามี:

[m,n]=size(A);
a=[zeros(m,m-1),A]';
for i=1:m+n-1
trace(a(i:end,:))
end

ขอให้สังเกตว่าการสลับเมทริกซ์จะกลับคำสั่งของผลบวกในแนวทแยงซึ่งบันทึกสองไบต์โดยรวมในลูป for

เอาท์พุท:

ans =  24
ans =  29
ans =  22
ans =  39
ans =  47
ans =  70
ans =  43
ans =  9
ans =  5

1
[m,n]=size(A);for i=1:m+n-1,trace([zeros(m-1,m);A'](i:end,:)),endบันทึก 6 ไบต์ ระดับแปดเสียงสามารถทำดัชนีโดยตรงและการกำหนดแบบอินไลน์ น่าเสียดายที่สมมติว่ามีตัวแปรอยู่ในพื้นที่ทำงานก่อนที่จะเรียกใช้รหัสไม่ได้รับอนุญาตดังนั้นฉันคิดว่าคุณต้องใช้inputเช่นนี้จะนำมันกลับไปที่ 75 ไบต์ แม้ว่าจะเป็นวิธีที่ดีดังนั้น +1 จากฉัน :) และยินดีต้อนรับสู่ PPCG! =)
Stewie Griffin

นอกจากนี้ยังzeros(m-1,m)สามารถเขียน~e(m-1,m)ได้ประหยัด 4 ไบต์ :) เรียบร้อยเหรอ?
Stewie Griffin

0

Python ขนาด 126 ไบต์

x=input()
f=lambda k:[x[i+k][i]for i in range(len(x)-k)]
a=map(f,range(4)[::-1])
x=zip(*x)
print(map(sum,a+map(f,range(1,4))))

fใช้งานได้เฉพาะในส่วนรูปสามเหลี่ยมด้านล่างเท่านั้นดังนั้นฉันจึงย้ายและรับส่วนรูปสามเหลี่ยมส่วนบนในลักษณะนั้น ไม่ทราบสาเหตุที่fฟังก์ชั่นใช้งานไม่ได้กับค่าลบ (ฉันเปลี่ยนfให้สั้นลงเพราะส่วนที่ให้ค่าลบไม่ทำงาน)


ฉันได้รับข้อผิดพลาดสำหรับกรณีทดสอบครั้งสุดท้าย tio.run/nexus/…
Dennis



0

Awk, 67 ไบต์

{for(f=0;f++<NF;)s[NF-NR+f]+=$f}END{i=0;while(i++<NR*2)print s[i]}

Ungolfed:

{
    for (f = 0; f++ < NF;)
        s[NF-NR+f] += $f
}
END {
    i = 0
    while (i++ < NR*2)
        print s[i]
}

Awk แยกบนช่องว่าง$nเป็นnเขตข้อมูลที่ 1 (ดัชนี 1); NFคือจำนวนฟิลด์ในบรรทัดNRคือจำนวนแถวปัจจุบัน ตัวแปรที่ไม่ได้กำหนดคือ 0 และสร้างเมื่อใช้ครั้งแรก


0

PHP, 86 ไบต์

โซลูชันที่เป็นมิตรกับหน่วยความจำในสองรูปแบบ:

<?for($i=$c=count($a=$_GET);--$i>-$c;print$s._)for($s=0,$d=$c;$d--;)$s+=$a[$i+$d][$d];
<?for($i=$c=count($a=$_GET);--$i>-$c;print$s._)for($s=$d=0;$d<$c;)$s+=$a[$i+$d][$d++];

รับอินพุตจากพารามิเตอร์สคริปต์ใช้ขีดล่างเป็นตัวคั่น
ใช้การตั้งค่าเริ่มต้น (ไม่ใช่ php.ini ที่เป็นค่าเริ่มต้น) หรือลองใช้แบบออนไลน์


0

Clojure, 81 ไบต์

#(apply map +(map(fn[i c](concat(repeat(-(count %)i 1)0)c(repeat i 0)))(range)%))

verbose ค่อนข้างเนื่องจากมันแสดงรายการด้วยศูนย์เพื่อให้เราสามารถคำนวณผลรวมคอลัมน์ที่ชาญฉลาด


0

mathematica 73 ไบต์

Plus@@@Table[Diagonal[Partition[#1,#2[[1]]],k],{k,-#2[[2]]+1,#2[[1]]-1}]&

อันนี้ใช้ได้กับอาเรย์ 2 มิติใด ๆ mxn (ไม่เพียง แต่ nxn)
ใส่อาเรย์ที่ส่วนท้ายของรหัสเช่นนี้ (กรณีทดสอบล่าสุด)

[{17,4,5,24,16,5,9,24,10,1,14,22,1,21,24,4,4,17,24,25,17},{3,7}]

{24, 29, 22, 39, 47, 70, 43, 9, 5}

อินพุตในรูปแบบ [{a, b, c, d ... }, {m, n}]

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