Gấp một ma trận!


13

Đưa ra một ma trận, tính tổng các giá trị của nó lên / xuống hoặc trái / phải để tạo thành một X, gấp nó lại và trả về danh sách. Tôi mô tả thuật toán ở đây:

Thuật toán

Đầu vào của bạn sẽ là một ma trận số nguyên có kích thước lẻ trong khả năng số hợp lý của ngôn ngữ của bạn.

Hãy lấy ma trận sau đây làm ví dụ:

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

Đầu tiên, thêm mọi số vào số gần nhất nằm trên đường chéo chính hoặc đường chéo. Đó là, chia ma trận thành bốn phần dọc theo đường chéo chính và đường chéo, sau đó tổng tất cả các số trong mỗi phần về phía trung tâm, như vậy:

1   2   3   2   1
    ↓   ↓   ↓    
0 → 3   2   3 ← 0
        ↓        
4 → 2 → 5 ← 6 ← 3
        ↑        
7 → 4   7   9 ← 4
    ↑   ↑   ↑    
0   6   7   2   5

Bước này cho kết quả như sau:

1        1
  5    5
    39
  17  15
0        5

Sau đó, chúng tôi gấp nó bằng cách làm phẳng X và đan xen các phần tử với phần trên cùng bên trái trước và phần dưới cùng bên trái cuối cùng. Điều này cho kết quả như sau:

1, 0, 5, 17, 39, 5, 15, 1, 5

Bạn có thể tưởng tượng điều này như kéo dài đường chéo chính và xoay nó ngược chiều kim đồng hồ.

Đây là kết quả cuối cùng.

Thử thách

Thực hiện thuật toán này. Tiêu chuẩn áp dụng. Tất cả các định dạng I / O hợp lý đều được chấp nhận.

Các trường hợp thử nghiệm

Input
Output

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

1, 0, 5, 17, 39, 5, 15, 1, 5

1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0

1, 6, 11, 16, 47, 7, 22, 5, 0

1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9

1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9

Bạn có thể thêm trường hợp kiểm tra ma trận "không phải 5 × 5" không?
hoàn toàn là

1
@icrieverytim ở đây bạn đi
HyperNeutrino

Câu trả lời:


7

JavaScript, 113 byte

s=>(l=s.length-1,a=[],s.map((v,y)=>v.map((n,x)=>a[q=2*[x,y,l-y].sort((u,v)=>u-v)[1]+(y>l/2),q-=q>l]=~~a[q]+n)),a)


Umm .. tại sao ~~? Họ trung hòa lẫn nhau, vì vậy không cần cho họ.
Kevin Cruijssen

2
@KevinCruijssen ~~undefined==0, vì vậy đây là golf hơn (a[q]||0).
Neil

@Neil Ah, đã không nghĩ về undefined. Khi tôi sao chép trường hợp thử nghiệm tsh được sử dụng, tôi nhận thấy nó hoạt động mà không có ~~. Và vì ~~xtương tự như nhau -(-x)trung hòa lẫn nhau, tôi đoán rằng nó bằng cách nào đó được đặt ở đó một cách tình cờ. Cảm ơn vì sự đúng đắn của bạn.
Kevin Cruijssen

5

Thạch , 25 23 21 byte

AṂ×ṠṚ
LHŒRṗ2Ç€ḅLĠịFS€

Hãy thử trực tuyến!

Phiên bản thay thế, 19 byte

AṂ×ṠṚ
LHŒRṗ2Ç€ĠịFS€

Điều này đã không được sử dụng để làm việc vì Ġhành vi không đúng cho các mảng lồng nhau. Sự khác biệt duy nhất là các cặp [q, p] được đề cập trong Cách thức hoạt động được sắp xếp theo từ vựng thay vì ánh xạ chúng thành p + nq trước khi sắp xếp.

Hãy thử trực tuyến!

Lý lịch

Chúng tôi bắt đầu bằng cách thay thế các phần tử của nó bằng tọa độ, tăng dần sang trái và xuống và đặt (0, 0) vào trung tâm của ma trận.

Đối với ma trận 7x7 M , chúng ta nhận được các tọa độ sau.

(-3,-3) (-3,-2) (-3,-1) (-3, 0) (-3, 1) (-3, 2) (-3, 3)
(-2,-3) (-2,-2) (-2,-1) (-2, 0) (-2, 1) (-2, 2) (-2, 3)
(-1,-3) (-1,-2) (-1,-1) (-1, 0) (-1, 1) (-1, 2) (-1, 3)
( 0,-3) ( 0,-2) ( 0,-1) ( 0, 0) ( 0, 1) ( 0, 2) ( 0, 3)
( 1,-3) ( 1,-2) ( 1,-1) ( 1, 0) ( 1, 1) ( 1, 2) ( 1, 3)
( 2,-3) ( 2,-2) ( 2,-1) ( 2, 0) ( 2, 1) ( 2, 2) ( 2, 3)
( 3,-3) ( 3,-2) ( 3,-1) ( 3, 0) ( 3, 1) ( 3, 2) ( 3, 3)

Bây giờ chúng ta tính giá trị tuyệt đối tối thiểu của từng cặp tọa độ và nhân các dấu của cả hai tọa độ theo nó, ánh xạ (i, j) thành (ký (i) m, ký (j) m) , trong đó m = min (| i | , | j |) .

(-3,-3) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-3, 3)
(-2,-2) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-2, 2)
(-1,-1) (-1,-1) (-1,-1) ( 0, 0) (-1, 1) (-1, 1) (-1, 1)
( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0)
( 1,-1) ( 1,-1) ( 1,-1) ( 0, 0) ( 1, 1) ( 1, 1) ( 1, 1)
( 2,-2) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 2, 2)
( 3,-3) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 3, 3)

Các yếu tố ma trận tương ứng với cùng một cặp phải được tổng hợp. Để xác định thứ tự của các khoản tiền, chúng tôi lập bản đồ mỗi cặp (p, q) để p + NQ , nơi n là số hàng / cột của M .

-24 -16  -8   0   6  12  18
-16 -16  -8   0   6  12  12
 -8  -8  -8   0   6   6   6
  0   0   0   0   0   0   0
 -6  -6  -6   0   8   8   8
-12 -12  -6   0   8  16  16
-18 -12  -6   0   8  16  24

Thứ tự của các khoản tiền tương ứng với thứ tự các số nguyên tương ứng với các tổng của nó.

Làm thế nào nó hoạt động

LHŒRṗ2Ç€ḅLĠịFS€  Main link. Argument: M (matrix)

L                Compute n, the length (number of rows) of M.
 H               Halve it.
  ŒR             Symmetric range; map t to [-int(t), ..., 0, int(t)].
    ṗ2           Compute the second Cartesian power, yielding all pairs [i, j]
                 with -t ≤ i, j ≤ t.
      ǀ         Map the helper link over the resulting array of pairs.
         L       Yield n.
        ḅ        Unbase; map each pair [q, p] to (p + nq).
          Ġ      Group the indices of the resulting array of n² integers by their
                 corresponding values, ordering the groups by the values.
            F    Flatten M.
           ị     Index into the serialized matrix.
             S€  Compute the sum of each group.


AṂ×ṠṚ            Helper link. Argument: [i, j] (index pair)

A                Absolute value; yield [|i|, |j|].
 Ṃ               Minimum; yield m := min(|i|, |j|).
   Ṡ             Sign; yield [sign(i), sign(j)].
  ×              Multiply; yield [p, q] := [sign(i)m, sign(j)m].
    Ṛ            Reverse; yield [q, p].

5
điều này thật tuyệt vời
Uriel

5

Python, 159 158 byte

def f(m):l=len(m)-1;r=range(1,l);return m[0][::l]+f([[sum(m[x][1%y*y:(y>l-2)-~y])+m[0][y]*(x<2)+m[l][y]*(x>l-2)for y in r]for x in r])+m[l][::l]if l else m[0]

Hãy thử trực tuyến!


1
y+1+(y>l-2)có thể (y>l-2)-~y.
Jonathan Frech


2

APL (Dyalog) , 60 byte *

Phối hợp với đồng nghiệp Marshall của tôi .

Tiền tố nặc danh lambda. Lấy ma trận làm đối số và trả về vector. Giả sử ⎕IO ( I ndex O rigin) bằng 0, được mặc định trên nhiều hệ thống.

{(,⍉{+/,(s×-×⍺)↓⍵×i∊¨⍨s←⌊⊃r÷2}⌺r⊢⍵)/⍨,(⊢∨⌽)=/¨i←⍳r←⍴⍵}

Hãy thử trực tuyến!

{... } lambda vô danh; là đối số đúng (như chữ cái ngoài cùng bên phải của bảng chữ cái Hy Lạp):

⍴⍵ hình dạng của đối số (danh sách hai phần tử giống nhau)

r← lưu trữ như r(như trong r ho)

 tất cả ɩ ndices của một loạt các kích thước đó, tức là (0 0), (0 1)...

i← lưu trữ trong i(như trong i ota)

=/¨ Boolean trong đó tọa độ bằng nhau (tức là đường chéo)

(... ) áp dụng chức năng tiền tố ngầm ẩn danh này:

   đảo ngược lập luận

  ⊢∨ HOẶC điều đó với đối số không được sửa đổi

, ravel (thẳng vào danh sách đơn giản)

 Bây giờ chúng ta có một mặt nạ Boolean cho các đường chéo.

(... )/⍨ sử dụng mà để lọc những điều sau đây:

  ⊢⍵ mang lại (để tách khỏi r) đối số

  {... }⌺r gọi infix lambda anonymous sau trên mỗi phần tử, với r-neighbourhood (đệm bằng số không khi cần thiết) như là đối số bên phải ( ), và một danh sách hai yếu tố của số đệm hàng, cột (tiêu cực đối với dưới / phải, không cho không có) như đối số bên trái ( ):

   r÷2 chia rcho hai

    chọn phần tử đầu tiên (chúng giống hệt nhau)

    sàn nó

   s← cửa hàng như s(ví s Hape)

   i∊⍨¨ cho mỗi phần tử của i, Boolean nếu slà thành viên của nó

   ⍵× nhân lên hàng xóm

   (... )↓ thả các số sau đây của các hàng và cột (tiêu cực đối với dưới / phải):

    ×⍺ dấu hiệu của đối số bên trái (tức là hướng của paddings)

    - phủ định

     nhân shợp thì

   , ravel (thẳng vào danh sách)

   +/ tổng (cộng giảm)

Bây giờ chúng ta có ma trận tổng hợp đầy đủ, nhưng chúng ta cần lọc tất cả các giá trị đọc theo cột.

   hoán vị

  , ravel (thẳng vào danh sách đơn giản)


* Bằng cách tính như ⎕U233A . Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.