Susun ulang matriks, dua kali

20

Anda diberi persegi matriks , dan daftar (atau vektor) panjang yang berisi nomor sampai (atau melalui ). Tugas Anda adalah menyusun ulang kolom dan baris dari matriks sesuai dengan urutan yang ditentukan dalam .n×nSEBUAHkamun1n0n-1SEBUAHkamu

Artinya, Anda akan membangun sebuah matriks di mana elemen -th adalah elemen -th . Anda juga harus menampilkan kebalikan dari tindakan ini; yaitu, elemen (i, j) -A dari akan berakhir pada posisi dalam matriks .B(saya,j)(kamu(saya),kamu(j))SEBUAHSEBUAH(u(i),u(j))C

Sebagai contoh, diberikan

A=[111213212223313233],u=[312]

output harus

B=[333132131112232122],C=[222321323331121311]

Anda dapat mengambil input dan output melalui salah satu metode I / O default. Anda tidak harus menentukan matriks mana yang atau , selama Anda menghasilkan keduanya. Anda dapat mengasumsikan hanya berisi bilangan bulat positif, dan Anda dapat menggunakan pengindeksan berbasis 1 atau 0 untuk . Anda harus mendukung matriks hingga setidaknya ukuran .BCAu64×64

Contoh

===== 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
Sanchises
sumber
Sandbox
Sanchises
Bisakah kita menghasilkan tanpa baris kosong di sini , yaitu, seperti ini ? (tidak ada ambiguitas) Atau, gagal itu, gunakan 0sebagai pemisah?
Luis Mendo
@LuisMendo Tentu tidak masalah.
Sanchises
Apakah pengindeksan diperlukan untuk ini? Bisakah kita menggunakan pengindeksan dan input 0 u = [2, 0, 1]?
Nilai Tinta
@NilaiInk Lihat kalimat pertama, [...] yang berisi angka 1 hingga n (atau 0 hingga n − 1)
Sanchises

Jawaban:

6

R , 42 byte

function(A,o)list(A[o,o],A[I<-order(o),I])

Cobalah online!

Diambil Asebagai matrixindeks berbasis 1 dan 1 o.

Giuseppe
sumber
6

MATL , 15 13 byte

t3$)&Gw&St3$)

Masukan u, lalu A.

Keluaran B, kemudian Ctanpa pemisah, karena tidak ada ambiguitas.

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
5

Oktaf , 33 byte

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

Cobalah online!

Terima kasih kepada Luis untuk memperbaiki kesalahan dan menghemat beberapa byte!

Pengindeksan dasar berfungsi di sini untuk kedua tugas, dengan menetapkan vektor v sama dengan permutasi yang membatalkan u . Yaitu, jika u=(3,1,2) maka elemen pertama dari v adalah 2, karena 1 berada di posisi kedua dari u . Ini dilakukan dengan fungsi sortir Octave .

FryAmTheEggman
sumber
5

Python 3 dengan numpy, 51 45 byte

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

Cobalah online!

-6 byte terima kasih kepada @xnor

Fungsi ini mengambil dua argumen: numpymatriks dan vektor permutasi yang memiliki nilai dari 0 hingga n-1 .

Joel
sumber
@ Terima kasih! Saya merasa bahwa itu bisa dipersingkat dalam beberapa cara tetapi gagasan untuk menggunakan for-loop tidak muncul di pikiran saya.
Joel
4

PowerShell , 78 73 71 byte

($A,$u=$args)|%{$A[$u]|%{''+$_[$u]}
$u=1..$u.count|%{$u.indexof($_-1)}}

Cobalah online .

Andrei Odegov
sumber
3

J , 19 byte

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

Cobalah online!

  • Kata kerja utama ]/:~"1/:
    • Hak paling banyak /:mengurutkan arg kiri (matriks) sesuai dengan urutan yang akan mengurutkan arg kanan (urutan tertentu). Ini semacam baris.
    • Sekarang hasil itu diurutkan /:~"1lagi sesuai dengan urutan yang ditentukan ]. Tapi kali ini kami menyortir dengan peringkat 1, yaitu, kami menyortir setiap baris, yang memiliki efek menyortir kolom.
  • ],:/:Kami menerapkan hal di atas menggunakan urutan yang ditentukan ]dan tingkat atas urutan yang ditentukan /:. Ini memberi kita 2 hasil yang kita inginkan.
Yunus
sumber
Bagus! Saya sedang berpikir untuk menerapkan sort + transpos dua kali, tetapi akan berakhir lebih lama.
Galen Ivanov
udiizinkan berbasis-0, jadi sort ( /:) dapat mengindeks ( {) dengan bertukar args
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]]

Cobalah online!

James
sumber
Butuh satu menit untuk mencari tahu apa vitu. Sangat rapi bagaimana Anda menemukan penggunaan untuk kegagalan diam-diam mode non-tugas penugasan properti ke nilai primitif, dan menggunakannya untuk kasus dasar rekursi Anda.
Patrick Roberts
3

APL (Dyalog Extended) , 12 byte SBCS

kamuSEBUAHCB

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

Cobalah online!

kamu[3,1,2]

⍮⍨ penjajaran-selfie; [[3,1,2],[3,1,2]]

⍋¨ permutasi-inversi masing-masing; [[2,3,1],[2,3,1]]
 kemudian
⍮⍨ disandingkan dengan dirinya sendiri[[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]



SEBUAH
¨

Adm
sumber
3

J , 17 16 15 14 byte

-1 berkat @Jonah

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

Cobalah online!

ngn
sumber
1
Bagus! Anda bisa turun ke 14 dengan ([{"1{)~(,:/:): Cobalah online!
Jonah
Btw, pertanyaan acak: Saya perhatikan Anda golf (sangat baik) di J, APL dan K. Ingin tahu yang Anda sukai secara keseluruhan? Juga saya ingat Anda mengatakan Anda menggunakan K secara profesional, apakah saya mengingatnya kan?
Jonah
@Jonah jika saya harus memilih satu, itu pasti k (tolong ping saya di k chat jika Anda ingin tahu alasannya), tetapi saya menikmati bermain golf dalam semua bahasa array. sayangnya, saya bukan salah satu dari sedikit yang beruntung yang dapat memiliki pekerjaan bahasa k
ngn
2

Arang , 24 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Diindeks 0. Catatan: Ruang tambahan. Penjelasan:

    η                       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
Neil
sumber
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(" "))}

Cobalah online!

JohnWells
sumber
1

Perl 5 , 79 byte

sub{$[=1;($A,$u)=@_;@$v[@$u]=(1..@$u);map{$x=$_;[map[@$_[@$x]],@$A[@$x]]}$u,$v}

Cobalah online!

Nahuel Fouilleul
sumber
1

Jelly ,  12 11  13 byte

+2 :( untuk memperbaiki kasus ketika B = C

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

Tautan diad menerima daftar daftar, A( ndengan n), di sebelah kiri dan daftar nbilangan bulat pertama di sebelah kanan u,, yang menghasilkan daftar daftar daftar [B, C],.

Cobalah online!

Bagaimana?

ṭþ`œị¥@Ƭị@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
Jonathan Allan
sumber
1

q, 26 byte

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

iasc mengembalikan indeks untuk mengurutkan argumennya.

skeevey
sumber
1

Bersih , 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]]

Cobalah online!

Menentukan $ :: {{a}} [Int] -> [{{a}}](digunakan dengan a = Int) mengambil array array dan daftar indeks berbasis nol, mengembalikan daftar array array yang mengandung B dan C.

Suram
sumber
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))]]]

Cobalah online!

Mengambil parameter sebagai daftar 2D dan 1D dan mengembalikan daftar yang berisi dua daftar 2D B dan C. Saya tidak yakin apakah ada cara yang lebih bersih untuk melakukan semua for-loop.

Matthew Jensen
sumber
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];}

Cobalah online!

Berkat saran @ceilingcat untuk menggunakan #import <queue> alih-alih <vector> yang secara misterius membawa std :: vector

AZTECCO
sumber
@ceilingcat sekarang saya melihat bahwa antrian impor memberi saya akses ke vektor .. Apakah ini tergantung pada kompiler? Saya mencoba mencari informasi tentang ini tetapi tidak menemukan apa pun
AZTECCO