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.