รวมสามเหลี่ยมของเมทริกซ์ของฉัน


17

พื้นหลัง

deltaของอาร์เรย์ของจำนวนเต็มเป็นอาร์เรย์ที่เกิดขึ้นจากการรับความแตกต่างขององค์ประกอบที่ต่อเนื่องกัน ตัวอย่างเช่นมีสันดอนต่อไปนี้:[1, 2, 4, 7, 3, 9, 6][1, 2, 3, -4, 6, -3]

ตอนนี้เราจะกำหนดเดลตาของเมทริกซ์ของจำนวนเต็มเป็นเดลตาของแต่ละแถวและแต่ละคอลัมน์ที่มี

ตัวอย่างเช่น:

Row deltas:

1 2 3 4 │ => [1, 1, 1]
4 5 6 7 │ => [1, 1, 1]
7 1 8 2 │ => [-6, 7, -6]

Column deltas (the matrix' columns have been rotated into rows for simplicity):

1 4 7 │ => [3, 3] 
2 5 1 │ => [3, -4]
3 6 8 │ => [3, 2]
4 7 2 │ => [3, -5]

ซึ่งทำให้เรามีรายการของเมทริกซ์เดลต้าต่อไปนี้:

[[1, 1, 1], [1, 1, 1], [-6, 7, -6], [3, 3], [3, -4], [3, 2], [3, -5]]

และในขณะที่เราไม่ต้องการให้มันซ้อนกันเราจึงเรียบรายการนั้น:

[1, 1, 1, 1, 1, 1, -6, 7, -6, 3, 3, 3, -4, 3, 2, 3, -5]

งาน

งานของคุณคือการหาผลรวมของเดลต้าทั้งหมดของเมทริกซ์ที่ได้รับเป็นอินพุต โปรดทราบว่าเมทริกซ์จะประกอบด้วยจำนวนเต็มไม่เป็นลบเท่านั้น

กฎระเบียบ

  • ใช้กฎมาตรฐานทั้งหมด

  • คุณอาจจะสมมติเมทริกซ์มีอย่างน้อยสองค่าในแต่ละแถวและคอลัมน์ดังนั้นขนาดต่ำสุดจะเป็น2x2

  • คุณสามารถใช้เมทริกซ์ในรูปแบบที่สมเหตุสมผลได้ตราบใดที่คุณระบุ

  • คุณอาจไม่คิดว่าเมทริกซ์นั้นกำลังสอง

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

  • นี่คือ code-golf ดังนั้นรหัสที่สั้นที่สุด (เป็นไบต์) ในแต่ละภาษาจะชนะ!

กรณีทดสอบ

อินพุต => เอาท์พุท

[[1, 2], [1, 2]] => 2
[[8, 7, 1], [4, 1, 3], [5, 5, 5]] => -9
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => 24
[[9, 9, 9, 9, 9], [9, 9, 9, 9, 9]] => 0
[[1, 3, 14], [56, 89, 20], [99, 99, 99]] => 256
[[1, 2, 3, 4], [4, 5, 6, 7], [7, 1, 8, 2]] => 9
[[13, 19, 478], [0, 12, 4], [45, 3, 6], [1, 2, 3]] => -72

คำตอบ:


12

Python 2 , 42 ไบต์

lambda m:sum(r[-1]-r[0]for r in m+zip(*m))

ฟังก์ชั่นที่ไม่มีชื่อการรับรายการmและส่งคืนหมายเลขผลลัพธ์

ลองออนไลน์!

อย่างไร?

ผลรวมของ delta ของรายการคือองค์ประกอบสุดท้ายลบก่อนทุกอย่างอื่นก็ยกเลิก:
(r [n] -r [n-1]) + (r [n-1] -r [n-2] + ... + (r [2] -r [1]) = r [n] -r [1]

การzip(*m)ใช้การเปิดออก ( *) ของmการส่งผ่านแถวของmอาร์กิวเมนต์ที่แยกจากกันไปที่zip(สอดแทรก) และด้วยเหตุนี้เมทริกซ์ transposes ใน python 2 สิ่งนี้ให้ผลเป็นรายการ (ของ tuples แต่ก็ไม่เป็นไร) ดังนั้นเราจึงสามารถเพิ่ม (เชื่อมต่อ) เข้ากับ (ด้วย) mก้าวผ่านแถวและคอลัมน์ทั้งหมดของเราrทำเคล็ดลับข้างต้นสำหรับแต่ละรายการและเพิ่มผลลัพธ์ ( sum(...))


8

R , 34 ไบต์

function(m)sum(diff(m),diff(t(m)))

ลองออนไลน์!

ฟังก์ชั่นไม่ระบุชื่อ แต่เดิมฉันเคยapply(m,1,diff)ได้รับ rowwise แตกต่างกัน (และ2แทนที่จะ1เป็นคอลัมน์) แต่ดูที่คำตอบของ Stewie Griffinฉันลองด้วยความยุติธรรมdiffและใช้งานได้


8

อ็อกเทฟ 33 ไบต์

@(x)sum([diff(x)(:);diff(x')(:)])

ลองออนไลน์!

คำอธิบาย:

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



5

JavaScript (ES6), 68 67 ไบต์

m=>m.map(r=>s+=[...l=r].pop()-r[0],s=0)|m[0].map(v=>s+=l.pop()-v)|s

จัดรูปแบบและแสดงความคิดเห็น

m =>                              // given a matrix m
  m.map(r =>                      // for each row r of m
    s += [...l = r].pop() - r[0], //   add to s: last value of r - first value of r
    s = 0                         //   starting with s = 0
  ) |                             //
  m[0].map(v =>                   // for each value v in the first row of m:
    s += l.pop() - v              //   add to s: last value of last row of m - v
  ) |                             //
  s                               // return s

เพราะขนาดต่ำสุดของเมทริกซ์ใส่เป็น 2x2, มีการประกันเพื่อบังคับให้m.map(...)|m[0].map(...) นั่นเป็นเหตุผลที่มันปลอดภัยที่จะกลับผลสุดท้ายกับ0|s

กรณีทดสอบ


5

MATL , 7 ไบต์

dG!dhss

ลองออนไลน์!

คำอธิบาย:

สมมติว่าอินพุตเป็น

[8 7 1; 4 1 3; 5 5 5]

d        % Difference between rows of input
         % Stack:
         % [-4 -6  2; 1  4  2]
 G       % Grab the input again. Stack:
         % [-4 -6  2; 1  4  2]
         % [8 7 1; 4 1 3; 5 5 5]]
  !      % Transpose the bottom element. Stack:
         % [-4 -6  2; 1  4  2]
         % [8 4 5; 7 1 5; 1 3 5]
   d     % Difference between rows. Stack:
         % [-4 -6  2; 1  4  2]
         % [-1 -3  0; -6  2  0]
    h    % Concatenate horizontally. Stack:
         % [-4 -6  2 -1 -3  0; 1  4  2 -6  2  0]
     ss  % Sum each column, then sum all column sums. Stack:
         % -9



3

Husk , 7 ไบต์

ΣṁẊ-S+T

ลองออนไลน์!

-1 ขอบคุณMr. Xcoder ที่ให้ความสำคัญกับฉันSและ¤และต่อไปm(ซึ่งควรจะเป็น)
-1 ขอบคุณZgarbSเหยียดหยาม

คำอธิบาย:

ΣṁẊ-S+T 3-function composition
    S   (x -> y -> z) (f) -> (x -> y) (g) -> x (x) (implicit): f x g x
     +    f: [x] (x) -> [x] (y) -> [x]: concatenate two lists
      T   g: [[x]] (x) -> [[x]]: transpose x
 ṁ      (x -> [y]) (f) -> [x] (x) -> [y]: map f on x and concatenate
  Ẋ       f: (x -> y -> z) (f) -> [x] (x) -> [z]: map f on splat overlapping pairs of x
   -        f: TNum (x) -> TNum (y) -> TNum: y - x
Σ       [TNum] (x) -> TNum: sum x

อ๋อ 8 ไบต์โดยใช้
Mr. Xcoder

8 ไบต์เช่นกันโดยใช้วิธีการของคุณแทน
Mr. Xcoder

@ Mr.Xcoder ว้าวลืมไปแล้ว
Erik the Outgolfer


3

Haskell , 60 ไบต์

e=[]:e
z=zipWith
f s=sum$(z(-)=<<tail)=<<(s++foldr(z(:))e s)

ลองออนไลน์!ใช้การขนย้ายที่สั้นกว่าฉันพบเมื่อไม่นานมานี้

คำอธิบาย

eเป็นรายการที่ไม่มีที่สิ้นสุดของรายการว่างและใช้สำหรับการแปลง zเป็นชวเลขสำหรับzipWithฟังก์ชั่นเพราะมันจะใช้สองครั้ง

f s=                                        -- input s is a list of lists
                            foldr(z(:))e s  -- transpose s
                         s++                -- append the result to the original list s
                     =<<(                 ) -- map the following function over the list and concatenate the results
        (z(-)=<<tail)                       -- compute the delta of each list by element-wise subtracting its tail
    sum$                                    -- compute the sum of the resulting list

3

Brachylogขนาด 13 ไบต์

ตามแบบของการออกแบบ @ sundar

⟨≡⟨t-h⟩ᵐ²\⟩c+ 

คำอธิบาย

⟨≡      \⟩          #   Take the original matrix and it's transpose 
      ᵐ             #       and execute the following on both
       ²            #           map for each row (this is now a double map "ᵐ²")
  ⟨t h⟩             #               take head and tail
   -                #               and subtract them from each other (sum of deltas in a row)
         c+         #       and add all the values 
                    #           (we have two arrays of arrays so we concat them and sum them)

การ⟨⟩จัดรูปแบบกำลังสับสน

ลองออนไลน์!


2

Pyth, 7 ไบต์

ss.+M+C

ลองที่นี่

คำตอบแรกของฉันในภาษากอล์ฟ! ขอบคุณ@EriktheOutgolferสำหรับ -1 ไบต์!

คำอธิบาย

ss.+M+C    ~ This is a full program with implicit input (used twice, in fact)

      C    ~ Matrix transpose. Push all the columns;
     +     ~ Concatenate with the rows;
  .+M      ~ For each list;
  .+       ~ Get the deltas;
 s         ~ Flatten the list of deltas;
s          ~ Get the sum;
           ~ Print Implicitly;

.tสามารถCสำหรับ -1
Erik the Outgolfer

@EriktheOutgolfer โอ้ว้าวขอบคุณมาก!

2

Brachylog , 22 16 ไบต์

⟨≡{s₂ᶠc+ᵐ-}ᵐ\⟩+ṅ

ลองออนไลน์!

(-6 ไบต์แรงบันดาลใจจากคำแนะนำของ @ Kroppeb)

?⟨≡{s₂ᶠc+ᵐ-}ᵐ\⟩+ṅ.       Full code (? and . are implicit input and output)
?⟨≡{       }ᵐ\⟩          Apply this on both the input and its transpose:
    s₂ᶠ                  Get pairs of successive rows, [[row1, row2], [row2, row3], ...]
       c                 Flatten that: [row1, row2, row2, row3, row3, row4, ...]
        +ᵐ               Sum the elements within each row [sum1, sum2, sum2, sum3, ...]
          -              Get the difference between even-indexed elements (starting index 0)
                         and odd-indexed elements, i.e. sum1+sum2+sum3+... - (sum2+sum3+sum4+...)
                         This gets the negative of the usual difference i.e. a-b instead of b-a
                         for each pair of rows
               +         Add the results for the input and its transpose
                ṅ        Negate that to get the sign correct
                 .       That is the output

ผลรวมของเดลต้าเท่ากับองค์ประกอบสุดท้าย - อันแรก⟨t-h⟩ทำการหลอกลวง ส่งผลให้{⟨t-h⟩ᵐ+}R&\↰₁;R+มีขนาดสั้นลง 5 ไบต์ ลองออนไลน์!
Kroppeb

ใช้⟨≡{...}ᵐ\⟩+แทน{...}R&\↰₁;R+บันทึก 2 ไบต์ ส่งผลให้⟨≡{⟨t-h⟩ᵐ+}ᵐ\⟩+ ลองออนไลน์!
Kroppeb

การเปลี่ยนการแมปของแผนที่ในแผนที่คู่และการต่อข้อมูลและ somming ที่และลบ 2 ไบต์เพิ่มเติม ⟨≡⟨t-h⟩ᵐ²\⟩c+เพิ่มเติม ลองออนไลน์!
Kroppeb

@Kroppeb มันมีความแตกต่างและใหญ่พอสำหรับการปรับปรุงที่คุณควรโพสต์เป็นคำตอบใหม่ด้วยตัวคุณเอง เห็นคำแนะนำของคุณทำให้ฉันมีความคิดสำหรับวิธีการแก้ปัญหา 16 ไบต์โดยใช้วิธีการอื่น⟨≡{s₂ᶠc+ᵐ-}ᵐ\⟩+ṅ ลองออนไลน์! ดังนั้นฉันจะอัปเดตคำตอบนี้ด้วยเวอร์ชันนั้นแทน
sundar - Reinstate Monica


1

SOGL V0.12 , 9 ไบต์

:⌡-≤H⌡-¹∑

ลองที่นี่! (เพิ่มเนื่องจากสิ่งนี้ใช้อินพุตในสแต็ก)

คำอธิบาย:

:          duplicate ToS
 ⌡         for each do
  -          get deltas
   ≤       get the duplicate ontop
    H      rotate it anti-clockwise
     ⌡     for each do
      -      get deltas
       ¹   wrap all of that in an array
        ∑  sum

1
เพิ่มเนื่องจากสิ่งนี้ใช้อินพุตในสแต็ค - ฉันตั้งใจจะถามสิ่งนี้เป็นเวลานาน: อินพุตถูกส่งไปยังสแต็กโดยอัตโนมัติหรือไม่ หากไม่ใช่และคาดว่าอินพุตมีอยู่แล้วในสแต็กคุณไม่ควรเพิ่มจำนวนไบต์ของคุณด้วยใช่ไหม ไม่แน่ใจว่าจัดการกับสถานการณ์เหล่านี้อย่างไร หรือว่าเป็นฟังก์ชั่น?
Mr. Xcoder

@ Mr.Xcoder อืม .. ฉันคิดว่าได้รับอนุญาตจากอินพุตเริ่มต้น แต่ฉันคิดว่ามันมีเพียงฟังก์ชันนี้ .. จากนั้นอีกครั้งฉันสามารถเรียกสิ่งนี้ว่าฟังก์ชั่นที่ไม่มีชื่อที่ใช้เช่นนี้ (ใน SOGL ความหมายของ "ฟังก์ชัน" คือfunctionNameSingleChar\n)
dzaima

โอ้ไม่เป็นไร มันถูกต้องสมบูรณ์แล้ว
Mr. Xcoder

1

Mathematica ขนาด 45 ไบต์

Tr@Flatten[Differences/@#&/@{#,Transpose@#}]&

อินพุต

[{{13, 19, 478}, {0, 12, 4}, {45, 3, 6}, {1, 2, 3}}]


มันจะสั้นกว่าหรือไม่ถ้าจะลบอันแรกจากแถวสุดท้ายสำหรับแต่ละแถวใน{#,Transpose@#}(เช่นคำตอบของ Python)
Jonathan Allan

Total[Differences/@{#,Thread@#},3]&
alephalpha

1

CJam , 19 ไบต์

0q~_z+2few:::-:+:+-

อินพุตคือรายการของตัวเลข ลองออนไลน์!

คำอธิบาย

0       e# Push 0
q~      e# Evaluated input. 
_       e# Duplicate
z       e# Zip (transpose)
+       e# Concatenate. This gives a lists of lists of numbers, where the
        e# inner lists are the original rows and the columns
2few    e# Replace each inner list of numbers by a list of overlapping
        e# slices of size 2. We not have three-level list nesting
:::-    e# Compute difference for each of those size-two slices. We now
        e# have the deltas for each row and column
:+      e# Concatenate all second-level lists (de-nest one level)
:+      e# Sum all values
-       e# Subtract from 0, to change sign. Implicitly display

4
คำตอบนี้ต้องการโคลอนมากขึ้น มี2fewเครื่องหมายทวิภาค
แยกผลไม้

0

MY, 9 ไบต์

ωΔω⍉Δ ḟΣ↵

ลองออนไลน์!

เนื่องจากฉันไม่สามารถปิงเดนนิสในการแชทเพื่อดึง MY (เนื่องจากถูกระงับ) ปัจจุบันนี้จะไม่ทำงาน (Δก่อนหน้านี้ไม่ได้ทำให้ตกใจเมื่อลบ) ขอบคุณใครก็ตามที่มีเดนนิสที่จะดึงฉัน!

อย่างไร?

  • ωΔเพิ่มขึ้นของอาร์กิวเมนต์บรรทัดคำสั่งแรก
  • ω⍉Δเพิ่มขึ้นของการแปลงค่าของอาร์กิวเมนต์บรรทัดคำสั่งแรก
  • ในรายการเดียว
  • แบน
  • Σ, ผลรวม
  • เอาท์พุท


0

Pyt , 11 ไบต์

Đ⊤ʁ-⇹ʁ-áƑƩ~

คำอธิบาย:

          Implicit input (as a matrix)
Đ         Duplicate the matrix
⊤         Transpose the matrix
ʁ-        Get row deltas of transposed matrix
⇹         Swap top two elements on the stack
ʁ-        Get row deltas of original matrix
á         Push the stack into an array
Ƒ         Flatten the array
Ʃ         Sum the array
~         Flip the sign (because the deltas are negative, as subtraction was performed to obtain them)
          Implicit output
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.