Sắp xếp lại một ma trận, hai lần


20

Bạn được cung cấp một ma trận ma trận và một danh sách (hoặc vectơ) có độ dài chứa các số đến (hoặc đến ). Nhiệm vụ của bạn là sắp xếp lại các cột hàng của ma trận theo thứ tự được chỉ định trong .n×nAun1n0n1A uAu

Nghĩa là, bạn sẽ xây dựng một ma trận nơi yếu tố -thứ là yếu tố -thứ của . Bạn cũng nên xuất ra nghịch đảo của hành động này; nghĩa là, phần tử (i, j) của sẽ kết thúc tại vị trí trong ma trận .B(i,j)(u(i),u(j))MộtMột(u(i),u(j))C

Ví dụ: đã cho

A=[111213212223313233],u=[312]

đầu ra phải là

B=[333132131112232122],C=[222321323331121311]

Bạn có thể nhận đầu vào và đầu ra thông qua bất kỳ phương thức I / O mặc định nào. Bạn không phải chỉ định ma trận nào là hoặc , miễn là bạn xuất cả hai. Bạn có thể giả sử chỉ chứa các số nguyên dương và bạn có thể sử dụng lập chỉ mục dựa trên 1- hoặc 0 cho . Bạn phải hỗ trợ ma trận tối thiểu bằng .BCAu64×64

Thí dụ

===== Input =====
A =
 35     1     6    26    19    24
  3    32     7    21    23    25
 31     9     2    22    27    20
  8    28    33    17    10    15
 30     5    34    12    14    16
  4    36    29    13    18    11
u=
  3 5 6 1 4 2

==== Output =====
B = 
  2    27    20    31    22     9
 34    14    16    30    12     5
 29    18    11     4    13    36
  6    19    24    35    26     1
 33    10    15     8    17    28
  7    23    25     3    21    32
C = 
 17    15     8    10    28    33
 13    11     4    18    36    29
 26    24    35    19     1     6
 12    16    30    14     5    34
 21    25     3    23    32     7
 22    20    31    27     9     2


Chúng ta có thể xuất mà không có dòng trống ở đây , nghĩa là như thế này không? (không có sự mơ hồ) Hoặc, thất bại, sử dụng 0như dấu phân cách?
Luis Mendo

@LuisMendo Chắc chắn không có vấn đề gì.
Sanchises

Là 1 chỉ mục cần thiết cho điều này? Chúng ta có thể sử dụng 0-indexing và đầu vào u = [2, 0, 1]không?
Mực giá trị

@ValueInk Xem câu đầu tiên, [...] chứa các số từ 1 đến n (hoặc 0 đến n − 1)
Chiếm

Câu trả lời:



6

MATL , 15 13 byte

t3$)&Gw&St3$)

Đầu vào u, sau đó A.

Đầu ra B, sau đó Ckhông có dấu phân cách, vì không có sự mơ hồ.

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

Giải trình

t     % Take input u implicitly. Duplicate u
3$)   % Take input A implicitly. Index A with u as row and column indices
&G    % Push the two inputs again: u, A
w     % Swap
&S    % Push indices that would make u sorted. Call that v
t     % Duplicate v
3$)   % Index A with v as row as column indices. Display implcitly

5

Octave , 33 byte

@(A,u){A(u,u) A([~,v]=sort(u),v)}

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

Cảm ơn Luis đã sửa lỗi và lưu một vài byte!

Lập chỉ mục cơ bản hoạt động ở đây cho cả hai nhiệm vụ, bằng cách xác định một vectơ bằng với hoán vị hoàn tác . Nghĩa là, nếu thì phần tử đầu tiên của là 2, vì 1 nằm ở vị trí thứ hai của . Điều này được thực hiện với chức năng sắp xếp của Octave .vbạnu=(3,1,2)vu


5

Python 3 với numpy, 51 45 byte

lambda m,p:[m[x][:,x]for x in(p,p.argsort())]

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

-6 byte nhờ @xnor

Hàm lấy hai đối số: numpyma trận và vectơ hoán vị có các giá trị từ 0 đến n1 .



@xnor Cảm ơn! Tôi cảm thấy rằng nó có thể được rút ngắn theo một cách nào đó nhưng ý tưởng sử dụng một for-loop không xuất hiện trong đầu tôi.
Joel




3

J , 19 byte

(]/:~"1/:)"_ 1],:/:

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

  • Động từ chính ]/:~"1/:
    • Bên phải hầu hết /:sắp xếp arg bên trái (ma trận) theo thứ tự sẽ sắp xếp arg bên phải (thứ tự được chỉ định). Điều này sắp xếp hàng.
    • Bây giờ kết quả đó được sắp xếp /:~"1lại theo thứ tự được chỉ định ]. Nhưng lần này chúng tôi sắp xếp với thứ hạng 1, tức là chúng tôi sắp xếp từng hàng, có tác dụng sắp xếp các cột.
  • ],:/:Chúng tôi áp dụng cách trên bằng cách sử dụng cả thứ tự được chỉ định ]xếp loại của đơn hàng được chỉ định /:. Điều này cho chúng tôi 2 kết quả mà chúng tôi muốn.

Tốt đẹp! Tôi đã suy nghĩ về việc áp dụng sort + transpose hai lần, nhưng sẽ kết thúc lâu hơn.
Galen Ivanov

uđược phép dựa trên 0, vì vậy sort ( /:) có thể được lập chỉ mục ( {) với các đối số hoán đổi
ngn

3

JavaScript (Node.js) , 77 70 68 byte

a=>g=(u,v=[])=>[u.map((i,x)=>u.map(j=>a[i][j],v[i]=x)),v&&g(v,0)[0]]

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


Tôi mất một phút để tìm ra cái gì v. Thật gọn gàng làm thế nào bạn tìm thấy việc sử dụng cho chế độ không nghiêm ngặt trong việc chuyển nhượng quyền sở hữu thành một giá trị nguyên thủy và sử dụng nó cho trường hợp cơ sở đệ quy của bạn.
Patrick Roberts

3

APL (Dyalog Extended) , 12 byte SBCS

bạnMộtCB

⌷∘⎕¨⍋¨⍛⍮⍨⍮⍨⎕

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

bạn[3,1,2]

⍮⍨ juxtap vị trí-selfie; [[3,1,2],[3,1,2]]

⍋¨ hoán vị-nghịch đảo của mỗi; [[2,3,1],[2,3,1]]
 sau đó
⍮⍨ juxtapose với chính nó[[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]



Một
¨


3

J , 17 16 15 14 byte

-1 cảm ơn @Jonah

([{"1{)~(,:/:)

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


1
Tốt đẹp! Bạn có thể xuống tới 14 với ([{"1{)~(,:/:): Hãy thử trực tuyến!
Giô-na

Btw, câu hỏi ngẫu nhiên: Tôi nhận thấy bạn chơi golf (rất tốt) trong J, APL và K. Bạn có thích tổng thể không? Ngoài ra tôi dường như nhớ lại bạn nói rằng bạn đã sử dụng K một cách chuyên nghiệp, tôi có nhớ điều đó không?
Giô-na

@Jonah nếu tôi phải chọn một, đó chắc chắn sẽ là k (vui lòng ping tôi trong trò chuyện k nếu bạn muốn biết lý do), nhưng tôi thích chơi golf trong tất cả các ngôn ngữ mảng. thật đáng buồn, tôi không phải là một trong số ít người may mắn có thể có một công việc ngôn ngữ k
ngn

2

Than , 24 byte

E⟦ηEη⌕ηκ⟧Eθ⪫E觧θ§ιμ§ιξ 

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉ số 0. Lưu ý: Không gian lưu trữ. Giải trình:

    η                       Input `u`
   E                        Map over elements
     ⌕                      Index of
       κ                    Current index in
      η                     Input `u`
  η                         Input `u`
E⟦      ⟧                   Map over `u` and its inverse
          θ                 Input `A`
         E                  Map over elements
             θ              Input `A`
            E               Map over elements
                θ           Input `A`
               §            Indexed by
                  ι         Current vector
                 §          Indexed by
                   μ        Row index
              §             Indexed by
                     ι      Current vector
                    §       Indexed by
                      ξ     Column index
           ⪫                Join with spaces for readability
                            Implicitly print

2

Kotlin , 213 byte

{a:List<List<Int>>,u:List<Int>->val s=u.size
for(l in List(s){r->List(s){c->a[u[r]][u[c]]}})println(l.joinToString(" "))
for(l in List(s){r->List(s){c->a[u.indexOf(r)][u.indexOf(c)]}})println(l.joinToString(" "))}

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




1

Thạch ,  12 11  13 byte

+2 :( để sửa các trường hợp khi B = C

ṭþ`œị¥@Ƭị@2,0

Một liên kết dyadic chấp nhận một danh sách các danh sách, A( nbởi n), ở bên trái và một danh sách các nsố nguyên đầu tiên bên phải u, trong đó đưa ra một danh sách các danh sách , [B, C].

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

Làm sao?

ṭþ`œị¥@Ƭị@2,0 - Link: A, u
       Ƭ      - collect up while the results are no longer unique, applying:
     ¥@       -   last two links as a dyad with swapped arguments:
  `           -     use left (u) as both arguments of:
 þ            -       outer product with:
ṭ             -         tack
   œị         -     multi-dimensional index into last result (starting with A)
                ...at the end of the Ƭ-loop we have [A,B,...,C]
                                                 or [A] if A=B=C
                                                 or [A,B] if B=C but A!=B
          2,0 - literal pair [2,0]
         @    - with swapped arguments:
        ị     -   index into (1-based & modular) -> [B,C]
                                                 or [A,A]=[B,C] if A=B=C
                                                 or [B,B]=[B,C] if B=C

1

q, 26 byte

{Y:iasc y;(x[y;y];x[Y;Y])}

iasc trả về các chỉ mục để sắp xếp đối số của nó.


1

Sạch sẽ , 91 byte

import StdEnv
$a u=map(\l={{a.[i,j]\\j<-l}\\i<-l})[u,[k\\i<-[0..]&_<-u,j<-u&k<-[0..]|j==i]]

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

Xác định $ :: {{a}} [Int] -> [{{a}}](được sử dụng với a = Int) lấy một mảng các mảng và một danh sách các chỉ số dựa trên zero, trả về một danh sách các mảng chứa B và C.


1

Python 3 , 91 byte

lambda a,u:[[[a[y][x]for x in t]for y in t]for t in[u,[u.index(i)for i in range(len(u))]]]

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

Lấy tham số dưới dạng danh sách 2D và 1D và trả về danh sách chứa hai danh sách 2D B và C. Tôi không chắc có cách nào sạch hơn để thực hiện tất cả các vòng lặp không.


1

C ++ (gcc) , 148 142 byte

#import<queue>
#define q[o[i/z]*z+o[i%z]]
using V=std::vector<int>;int f(V m,V o,V&r,V&R,int z){int i=z*z;for(r=R=V(i);i--;r[i]=m q)R q=m[i];}

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

Nhờ đề xuất @ceilingcat để sử dụng #import <queue> thay vì <vector> mà bí ẩn mang đến std :: vector


@ceilingcat bây giờ tôi thấy rằng hàng đợi nhập cho phép tôi truy cập vào vector .. Nó có phụ thuộc vào trình biên dịch không? Tôi đang cố gắng tìm kiếm thông tin về điều này nhưng không tìm thấy gì
AZTECCO

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.