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


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

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

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 .


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 .



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




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.

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!


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
¨


3

J , 17 16 15 14 byte

-1 berkat @Jonah

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

Cobalah online!


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

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!




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

1

q, 26 byte

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

iasc mengembalikan indeks untuk mengurutkan argumennya.


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.


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.


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


@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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.