Reordene uma matriz, duas vezes

20

Você recebe um quadrado matriz e uma lista (ou vetor) de comprimento contendo os números 1 a n (ou 0 a n-1 ). Sua tarefa é reordenar as colunas e linhas da matriz A de acordo com a ordem especificada em u .n×nUMAvocên1n0 0n-1UMAvocê

Isto é, vai construir uma matriz de , onde a elemento -ésimo é o elemento -ésimo de . Você também deve gerar o inverso dessa ação; isto é, a (i, j) -ésimo elemento de vai acabar na posição em uma nova matriz .B(Eu,j)(você(Eu),você(j))UMAUMA(você(Eu),você(j))C

Por exemplo, dado

UMA=[1112132122233132.33],você=[312]

a saída deve ser

B=[333132131112232122],C=[222321323331121311]

Você pode obter entrada e saída através de qualquer um dos métodos de E / S padrão. Você não precisa especificar qual matriz é ou , desde que você produza as duas. Você pode assumir que contém apenas números inteiros positivos e pode usar a indexação baseada em 1 ou 0 para . Você deve suportar matrizes até pelo menos tamanho .BCAu64×64

Exemplo

===== 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
fonte
Sandbox
Sanchises
Podemos produzir sem a linha vazia aqui , ou seja, assim ? (não há ambiguidade) Ou, na sua falta, use 0como separador?
Luis Mendo
@LuisMendo Claro que não há problema.
Sanchises 20/09
A indexação 1 é necessária para isso? Podemos usar a indexação e entrada de 0 u = [2, 0, 1]?
Value Ink
@ValueInk Veja a primeira frase, [...] contendo os números de 1 a n (ou 0 a n-1)
Sanchises

Respostas:

6

R , 42 bytes

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

Experimente online!

Toma Acomo um matrixe índices baseados em 1 o.

Giuseppe
fonte
6

MATL , 15 13 bytes

t3$)&Gw&St3$)

Entradas u, então A.

Saídas B, então Csem um separador, pois não há ambiguidade.

Experimente online!

Explicação

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
fonte
5

Oitava , 33 bytes

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

Experimente online!

Obrigado a Luis por corrigir um erro e salvar vários bytes!

A indexação básica funciona aqui para as duas tarefas, definindo um vetor v igual à permutação que desfaz u . Ou seja, se u=(3,1,2) , o primeiro elemento de v é 2, uma vez que 1 está na segunda posição de u . Isso é realizado com a função de classificação do Octave .

FryAmTheEggman
fonte
5

Python 3 com numpy, 51 45 bytes

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

Experimente online!

-6 bytes graças a @xnor

A função usa dois argumentos: uma numpymatriz e um vetor de permutação com valores de 0 0 a n-1 .

Joel
fonte
@xnor Obrigado! Eu senti que poderia ser reduzido de alguma forma, mas a idéia de usar um forloop não veio à minha mente.
Joel
4

PowerShell , 78 73 71 bytes

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

Experimente online .

Andrei Odegov
fonte
3

J , 19 bytes

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

Experimente online!

  • Verbo principal ]/:~"1/:
    • O direito /:classifica o arg esquerdo (matriz) de acordo com a ordem que classificaria o arg direito (ordem especificada). Isso classifica as linhas.
    • Agora esse resultado é classificado /:~"1novamente de acordo com a ordem especificada ]. Mas desta vez estamos classificando com a classificação 1, ou seja, classificando cada linha, o que tem o efeito de classificar colunas.
  • ],:/:Aplicamos o acima exposto usando a ordem especificada ]e a classificação da ordem especificada /:. Isso nos dá os 2 resultados que queremos.
Jonah
fonte
Agradável! Eu estava pensando em aplicar sort + transpose duas vezes, mas vai acabar por mais tempo.
Galen Ivanov
utem permissão para ser baseado em 0, então sort ( /:) pode ser indexado ( {) com argumentos trocados
ngn
3

JavaScript (Node.js) , 77 70 68 bytes

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

Experimente online!

James
fonte
Levei um minuto para descobrir o que vera. É interessante como você encontrou um uso para falha silenciosa no modo não estrito da atribuição de propriedades a um valor primitivo e o usou para o seu caso base de recursão.
Patrick Roberts
3

APL (Dyalog Extended) , SBCS de 12 bytes

vocêUMACB

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

Experimente online!

você[3,1,2]

⍮⍨ justaposição-selfie; [[3,1,2],[3,1,2]]

⍋¨ permutação-inversão de cada um; [[2,3,1],[2,3,1]]
 então
⍮⍨ justapor com a própria[[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]



UMA
¨

Adão
fonte
3

J , 17 16 15 14 bytes

-1 graças a @Jonah

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

Experimente online!

ngn
fonte
1
Agradável! Você pode chegar ao 14 com ([{"1{)~(,:/:): Experimente online!
Jonah
Aliás, pergunta aleatória: notei que você joga golfe (muito bem) em J, APL e K. Curioso o que você prefere no geral? Também me lembro de você ter dito que usava K profissionalmente, estou me lembrando disso, certo?
Jonah
@ Jonah, se eu devo escolher um, que seria definitivamente k (pls me pingar no bate-papo k se você quiser saber os motivos), mas eu gosto de jogar golfe em todos os idiomas do array. Infelizmente, eu não sou um dos poucos sortudos que pode ter um emprego em língua k
NGN
2

Carvão , 24 bytes

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

Experimente online! Link é a versão detalhada do código. Indexado a 0. Nota: Espaço à direita. Explicação:

    η                       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
fonte
2

Kotlin , 213 bytes

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

Experimente online!

JohnWells
fonte
2

APL + WIN, 21 bytes

Solicita a entrada de u seguida de a. Saídas b imediatamente acima da parte superior de c sem separador:

(a←⎕)[u;u←⎕]⋄a[⍋u;⍋u]

Experimente online! Cortesia de Dyalog Classic

Graham
fonte
1

Geléia ,  12 11  13 bytes

+2 :( para corrigir casos quando B = C

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

Um link diádico que aceita uma lista de listas, A( npor n), à esquerda e uma lista dos primeiros nnúmeros inteiros à direita u, que produz uma lista de listas de listas [B, C],.

Experimente online!

Quão?

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

q, 26 bytes

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

iasc retorna índices para classificar seu argumento.

skeevey
fonte
1

Limpo , 91 bytes

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

Experimente online!

Define $ :: {{a}} [Int] -> [{{a}}](usado com a = Int) a obtenção de uma matriz de matrizes e uma lista de índices baseados em zero, retornando uma lista de matrizes de matrizes contendo B e C.

Furioso
fonte
1

Python 3 , 91 bytes

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

Experimente online!

Pega parâmetros como uma lista 2D e 1D e retorna uma lista contendo duas listas 2D B e C. Não tenho certeza se existe uma maneira mais limpa de executar todos os loops for-loops.

Matthew Jensen
fonte
1

C ++ (gcc) , 148 142 bytes

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

Experimente online!

Graças à sugestão do @ceilingcat, use #import <queue> em vez de <vector>, que traz misteriosamente std :: vector

AZTECCO
fonte
@ceilingcat agora vejo que a fila de importação me dá acesso ao vetor ... É dependente do compilador? Estou tentando pesquisar informações sobre isso, mas não encontrei nada
AZTECCO
1
Dicas para jogar golfe em C ++
ceilingcat 10/12