Bir matrisi iki kez yeniden sıralayın


20

Size bir kare matris ve ila (veya ila ) sayılarını içeren uzunluğunda bir liste (veya vektör) . Göreviniz sütunları yeniden düzenlemek için ve matriks sıraları belirtilen sıraya göre .n×nAun1n0n1Au

Kendisine, bir matris oluşturmak olacaktır B burada (i,j) inci elemanıdır (u(ben),u(j)) ve inci elemanı bir . Bu işlemin tersini de yapmalısınız; yani bir (i, j)-elementi yeni bir C matrisinde (u(ben),u(j)) pozisyonunda bulunur .C

Örneğin,

bir=[111213212223313233],u=[312]

çıktı

B=[333132131112232122],C=[222321323331121311]

Varsayılan G / Ç yöntemlerinden herhangi birini kullanarak girdi ve çıktı alabilirsiniz. Her ikisini de çıktıladığınız sürece hangi matrisin B veya C olduğunu belirtmeniz gerekmez . bir yalnızca pozitif tamsayılar içerdiğini varsayabilir ve u için 1- veya 0 tabanlı indeksleme kullanabilirsiniz . En az 64x64 boyuta kadar matrisleri desteklemelisiniz .

Misal

===== 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


Burada boş satır olmadan çıktı alabilir miyiz , yani böyle mi? (belirsizlik yoktur) Veya başarısız olursa, 0ayırıcı olarak mı kullanılır ?
Luis Mendo

@LuisMendo Elbette sorun yok.
Sanchises

Bunun için 1 endeksleme gerekli mi? 0 indeksleme ve giriş kullanabilir miyiz u = [2, 0, 1]?
Değer Mürekkebi

@ValueInk İlk cümleye bakın, [...] 1'den n'ye kadar sayıları içeren (veya 0'dan n'ye 1)
Sanchises

Yanıtlar:



6

MATL , 15 13 bayt

t3$)&Gw&St3$)

Girdiler u, o zaman A.

Çıktılar B, daha sonra Cbir ayırıcı olmadan, belirsizlik yoktur.

Çevrimiçi deneyin!

açıklama

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

Oktav , 33 bayt

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

Çevrimiçi deneyin!

Bir hatayı düzelttiği ve birkaç bayt kaydettiği için Luis'e teşekkürler !

Temel indeksleme, u geri getiren permütasyona eşit bir v vektörü tanımlayarak her iki görev için de çalışır . Yani, u = ( 3 , 1 , 2 ) ise, v'nin ilk elemanı 2'dir, çünkü 1, u'nun ikinci pozisyonundadır . Bu, Octave'nin sıralama işlevi ile gerçekleştirilir .uu=(3,1,2)vu


5

Numune ile Python 3 , 51 45 bayt

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

Çevrimiçi deneyin!

@Xnor sayesinde -6 bayt

İşlev iki argüman alır: 0 ile n - 1numpy arasında bir değere sahip bir matris ve permütasyon vektörü .0n-1



@xnor Teşekkürler! Bir şekilde kısaltılabileceğini hissettim ama for-loop kullanma fikri aklıma gelmedi.
Joel




3

J , 19 bayt

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

Çevrimiçi deneyin!

  • Ana fiil ]/:~"1/:
    • En sağ /:, sol arg (matris) 'i sağ argümanı (belirtilen sıra) sıralayacak sıraya göre sıralar. Bu sıraları sıralar.
    • Şimdi bu sonuç /:~"1belirtilen sıraya göre tekrar sıralanır ]. Ama bu sefer 1. sıra ile sıralıyoruz, yani sütunları sıralama etkisi olan her satırı sıralıyoruz.
  • ],:/:Biz Belirtilen düzeni hem kullanarak yukarıdaki uygulamak ]ve yukarı notu belirtilen düzenin /:. Bu bize istediğimiz 2 sonucu verir.

Güzel! İki kez sıralama + devrik uygulama düşünüyordum, ama daha uzun sürecek.
Galen Ivanov

u0 tabanlı olmasına izin verilir, bu nedenle sort ( /:) {
swapped

3

JavaScript (Node.js) , 77 70 68 bayt

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

Çevrimiçi deneyin!


Ne olduđunu bulmak bir dakikamý aldý v. İlkel bir değere özellik atamasının katı olmayan mod sessiz başarısızlığı için bir kullanım nasıl bulduğunuz ve bunu yineleme taban durumunuz için nasıl kullandığınız temiz.
Patrick Roberts

3

APL (Dyalog Genişletilmiş) , 12 bayt SBCS

ubirCB

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

Çevrimiçi deneyin!

u[3,1,2]

⍮⍨ yan yana-selfie'si; [[3,1,2],[3,1,2]]

⍋¨ her birinin permütasyon-ters çevrilmesi; [[2,3,1],[2,3,1]]
 sonra
⍮⍨ kendisiyle yan yana getir[[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]


 değerini,  yeniden sıralayın
bir
¨


3

J , 17 16 15 14 bayt

@Jonah sayesinde -1

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

Çevrimiçi deneyin!


1
Güzel! Aşağıdakilerle 14'e kadar inebilirsiniz ([{"1{)~(,:/:): Çevrimiçi deneyin!
Jonah

Btw, rastgele soru: J, APL ve K'de golf (çok iyi) olduğunu fark ettim. Ayrıca profesyonel olarak K kullandığınızı hatırlıyorum, bunu hatırlıyor muyum?
Jonah

@Jonah bir tane seçmeliysem, kesinlikle k olurdu ( nedenlerini bilmek istiyorsanız lütfen bana k sohbetinde ping atın ), ancak tüm dizi dillerinde golf oynamanın tadını çıkarın. ne yazık ki, ben k-dil bir iş olabilir şanslı birkaç biri değilim
ngn

2

Kömür , 24 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. 0 endeksli. Not: Sondaki boşluk. Açıklama:

    η                       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 bayt

{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(" "))}

Çevrimiçi deneyin!




1

Jöle ,  12 11  13 bayt

+2 :( B = C olduğunda durumları düzeltmek için

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

Listelerin bir listesini kabul İKİLİ Link A( nby nsolda) ve ilk listesi n, sağda, tamsayılar ulistelerinin listelerin bir listesini verir, [B, C].

Çevrimiçi deneyin!

Nasıl?

ṭþ`œị¥@Ƭị@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 bayt

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

iasc argümanını sıralamak için dizinler döndürür.


1

Temiz , 91 bayt

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

Çevrimiçi deneyin!

Bir dizi diziyi ve sıfır temelli indekslerin bir listesini alarak (B ile C) içeren dizilerin dizilerinin bir listesini döndürerek $ :: {{a}} [Int] -> [{{a}}](ile kullanılır a = Int) tanımlar .


1

Python 3 , 91 bayt

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

Çevrimiçi deneyin!

Parametreleri 2D ve 1D listesi olarak alır ve iki 2D listesi B ve C içeren bir liste döndürür. Tüm for-loop'ları yapmanın daha temiz bir yolu olup olmadığından emin değilim.


1

C ++ (gcc) , 148142 bayt

#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];}

Çevrimiçi deneyin!

Gizemli bir şekilde std :: vector getiren <vector> yerine #ceport <queue> kullanılması için @ceilingcat önerisi sayesinde


@ ceilingcat şimdi ithalat sırasının vektöre erişim sağladığını görüyorum .. Derleyiciye bağımlı mı? Bu konuda bilgi aramaya çalışıyorum ama hiçbir şey bulamadım
AZTECCO

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.