Riordina una matrice, due volte


20

Ti viene dato un quadrato matrice e un elenco (o vettore) di lunghezza contenente i numeri da a (o da a ). Il tuo compito è riordinare le colonne e le righe della matrice secondo l'ordine specificato inn×nUNun1n0n-1UNu .

Cioè, si costruisce una matrice in cui il elemento -esimo è il elemento -esimo di . Dovresti anche generare l'inverso di questa azione; cioè, il (i, j) -esimo elemento di finirà nella posizione in una nuova matrice .B(io,j)(u(io),u(j))UNUN(u(io),u(j))C

Ad esempio, dato

UN=[111213212223313233],u=[312]

l'output dovrebbe essere

B=[333132131112232122],C=[222321323331121311]

È possibile accettare input e output tramite uno dei metodi I / O predefiniti. Non è necessario specificare quale matrice è o , purché vengano emessi entrambi. Si può assumere contiene solo numeri interi positivi, e si può utilizzare l'indicizzazione a 1 o 0-based per . È necessario supportare matrici fino a una dimensione minima diBCAu64×64 .

Esempio

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


Possiamo emettere senza la riga vuota qui , cioè in questo modo ? (non c'è ambiguità) Oppure, in mancanza, usare 0come separatore?
Luis Mendo,

@LuisMendo Certo nessun problema.
Sanchises,

Per questo è necessario l'indicizzazione 1? Possiamo usare l'indicizzazione 0 e l'input u = [2, 0, 1]?
Valore inchiostro

@ValueInk Vedi la prima frase, [...] contenente i numeri da 1 a n (o da 0 a n − 1)
Sanchises

Risposte:



6

MATL , 15 13 byte

t3$)&Gw&St3$)

Ingressi u, quindi A.

Output B, quindi Csenza un separatore, in quanto non vi è alcuna ambiguità.

Provalo online!

Spiegazione

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

Ottava , 33 byte

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

Provalo online!

Grazie a Luis per la correzione di un errore e il salvataggio di diversi byte!

L'indicizzazione di base funziona qui per entrambe le attività, definendo un vettore v uguale alla permutazione che annulla u . Cioè, se u=(3,1,2) il primo elemento di v è 2, poiché 1 è nella seconda posizione di u . Ciò si ottiene con la funzione di ordinamento di Octave .


5

Python 3 con numpy, 51 45 byte

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

Provalo online!

-6 byte grazie a @xnor

La funzione accetta due argomenti: una numpymatrice e un vettore di permutazione con valori compresi tra 0 e n-1 .



@xnor Grazie! Ho sentito che poteva essere abbreviato in qualche modo, ma l'idea di usare un for-loop non mi è venuta in mente.
Gioele il




3

J , 19 byte

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

Provalo online!

  • Verbo principale ]/:~"1/:
    • La destra /:ordina l'arg sinistra (matrice) secondo l'ordine che ordinerebbe l'arg destra (ordine specificato). Questo ordina le righe.
    • Ora quel risultato viene /:~"1nuovamente ordinato secondo l'ordine specificato ]. Ma questa volta stiamo ordinando con il rango 1, cioè, stiamo ordinando ogni riga, il che ha l'effetto di ordinare le colonne.
  • ],:/:Applichiamo quanto sopra utilizzando sia l'ordine specificato ]sia il grado di classificazione dell'ordine specificato /:. Questo ci dà i 2 risultati che vogliamo.

Bello! Stavo pensando di applicare sort + transpose due volte, ma finirò più a lungo.
Galen Ivanov,

uè consentito essere basato su 0, quindi sort ( /:) potrebbe essere indicizzato ( {) con args scambiati
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]]

Provalo online!


Mi ci è voluto un minuto per capire cosa vfosse. È pulito il modo in cui hai trovato un uso per un errore silenzioso in modalità non rigorosa dell'assegnazione di proprietà a un valore primitivo e l'hai usato per il tuo caso di base ricorsivo.
Patrick Roberts,

3

APL (Dyalog Extended) , 12 byte SBCS

uUNCB

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

Provalo online!

u[3,1,2]

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

⍋¨ permutazione-inversione di ciascuno; [[2,3,1],[2,3,1]]
 quindi
⍮⍨ giustapporsi con se stesso[[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]



UN
¨


3

J , 17 16 15 14 byte

-1 grazie a @Jonah

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

Provalo online!


1
Bello! Puoi arrivare a 14 con ([{"1{)~(,:/:): Provalo online!
Giona,

A proposito, domanda a caso: ti ho notato giocare a golf (molto bene) in J, APL e K. Curioso quale preferisci nel complesso? Inoltre, ti ricordo di aver detto che hai usato K in modo professionale, me lo ricordo bene?
Giona il

@Jonah, se devo sceglierne uno, sarebbe sicuramente k (per favore chiamami nella chat di k se vuoi conoscere i motivi), ma mi piace giocare a golf in tutte le lingue dell'array. purtroppo, non sono uno dei pochi fortunati che possono avere un lavoro in k-language
ngn

2

Carbone , 24 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. 0-indicizzati. Nota: spazio finale. Spiegazione:

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

Provalo online!




1

Gelatina ,  12 11  13 byte

+2 :( per correggere i casi quando B = C

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

Un collegamento diadica accettare una lista di liste, A( nper n), a sinistra e un elenco dei primi nnumeri interi a destra, uche produce una lista di liste di liste, [B, C].

Provalo online!

Come?

ṭþ`œị¥@Ƭị@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 restituisce gli indici per ordinare l'argomento.


1

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

Provalo online!

Definisce $ :: {{a}} [Int] -> [{{a}}](utilizzato con a = Int) prendendo una matrice di matrici e un elenco di indici a base zero, restituendo un elenco di matrici di matrici contenenti B e 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))]]]

Provalo online!

Prende i parametri come un elenco 2D e 1D e restituisce un elenco contenente due elenchi 2D B e C. Non sono sicuro che esista un modo più pulito di eseguire tutti i 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];}

Provalo online!

Grazie al suggerimento di @ceilingcat di usare #import <queue> invece di <vector> che porta misteriosamente std :: vector


@ceilingcat ora vedo che la coda di importazione mi dà accesso al vettore .. Dipende dal compilatore? Sto cercando di cercare informazioni su questo ma non
ho

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.