Reordenar una matriz, dos veces


20

Se le da un cuadrado n×n matriz A , y una lista (o vector) u de longitud n contiene los números 1 a n (o 0 a n1 ). Su tarea es reordenar las columnas y filas de la matriz A acuerdo con el orden especificado en u .

Eso es, se construye una matriz B en donde el (i,j) elemento-ésimo es el (u(i),u(j)) elemento -ésimo de A . También debe generar el inverso de esta acción; es decir, el elemento-ésima (i, j) de A va a terminar en la posición (u(i),u(j)) en una nueva matriz C .

Por ejemplo, dado

A=[111213212223313233],u=[312]

la salida debe ser

B=[333132131112232122],C=[222321323331121311]

Puede tomar entrada y salida a través de cualquiera de los métodos de E / S predeterminados. No tiene que especificar qué matriz es B o C , siempre que genere ambas. Puede suponer que A solo contiene enteros positivos, y puede usar indexación basada en 1 o 0 para u . Debe admitir matrices de al menos 64×64 .

Ejemplo

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


¿Podemos generar sin la línea vacía aquí , es decir, así ? (no hay ambigüedad) ¿O, en su defecto, utilizar 0como separador?
Luis Mendo

@LuisMendo Claro que no hay problema.
Sanchises

¿Se requiere 1 indexación para esto? ¿Podemos usar la indexación 0 y la entrada u = [2, 0, 1]?
Value Ink

@ValueInk Vea la primera oración, que [...] contiene los números 1 a n (o 0 a n − 1)
Sanchises

Respuestas:



6

MATL , 15 13 bytes

t3$)&Gw&St3$)

Entradas u, entonces A.

Salidas B, luego Csin separador, ya que no hay ambigüedad.

Pruébalo en línea!

Explicación

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






3

J , 19 bytes

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

Pruébalo en línea!

  • Verbo principal ]/:~"1/:
    • El más a la derecha /:clasifica el argumento izquierdo (matriz) de acuerdo con el orden que ordenaría el argumento derecho (orden especificado). Esto ordena filas.
    • Ahora ese resultado se ordena de /:~"1nuevo según el orden especificado ]. Pero esta vez estamos ordenando con el rango 1, es decir, estamos ordenando cada fila, lo que tiene el efecto de ordenar las columnas.
  • ],:/:Aplicamos lo anterior utilizando el orden especificado ]y la calificación del orden especificado /:. Esto nos da los 2 resultados que queremos.

¡Agradable! Estaba pensando en aplicar sort + transpose dos veces, pero terminaré más tiempo.
Galen Ivanov

use le permite estar basada en 0, por lo sort ( /:) podría ser de indexación ( {) con argumentos intercambiados
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]]

Pruébalo en línea!


Me llevó un minuto descubrir qué vera. Es interesante cómo encontró un uso para la falla silenciosa de modo no estricto de la asignación de propiedades a un valor primitivo, y lo usó para su caso base de recursión.
Patrick Roberts el

3

APL (Dyalog Extended) , SBCS de 12 bytes

Programa completo Indicaciones paratu y entonces UN. Huellas dactilaresC cerca de si, separados por dos espacios

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

Pruébalo en línea!

 solicitar tu; [3,1,2]

⍮⍨ yuxtaposición-selfie; [[3,1,2],[3,1,2]]

⍋¨ permutación-inversión de cada uno; [[2,3,1],[2,3,1]]
 luego
⍮⍨ yuxtaponerse consigo mismo[[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]

 reordenar
 el valor de
UNcomo se ingresa
¨ usando cada par como un conjunto de órdenes, una orden por eje


3

J , 17 16 15 14 bytes

-1 gracias a @Jonah

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

Pruébalo en línea!


1
¡Agradable! Puede bajar a 14 con ([{"1{)~(,:/:): ¡ Pruébelo en línea!
Jonás

Por cierto, pregunta al azar: me di cuenta de que juegas golf (muy bien) en J, APL y K. ¿Curioso que prefieres en general? También parece recordar que dijiste que usaste K profesionalmente, ¿lo recuerdo bien?
Jonás

@Jonah si debo elegir uno, definitivamente sería k (por favor, hágame ping en el chat de k si desea conocer los motivos), pero disfruto jugando al golf en todos los idiomas de la matriz. Por desgracia, no soy uno de los pocos afortunados que pueden tener un trabajo k-idioma
NGN

2

Carbón de leña , 24 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. 0 indexado. Nota: espacio final. Explicación:

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

Pruébalo en línea!




1

Jalea ,  12 11  13 bytes

+2 :( para arreglar casos cuando B = C

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

Un Enlace diádica aceptar una lista de listas, A( npor n), a la izquierda y una lista de los primeros nnúmeros enteros a la derecha, uque da una lista de listas de listas, [B, C].

Pruébalo en línea!

¿Cómo?

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

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

iasc devuelve índices para ordenar su argumento.


1

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

Pruébalo en línea!

Define $ :: {{a}} [Int] -> [{{a}}](se usa con a = Int) tomar una matriz de matrices y una lista de índices basados ​​en cero, devolviendo una lista de matrices de matrices que contienen B y C.


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

Pruébalo en línea!

Toma los parámetros como una lista 2D y 1D y devuelve una lista que contiene dos listas 2D B y C. No estoy seguro de si hay una forma más limpia de hacer todos los bucles for.


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

Pruébalo en línea!

Gracias a la sugerencia de @ceilingcat de usar #import <queue> en lugar de <vector> que misteriosamente trae std :: vector


@ceilingcat ahora veo que la cola de importación me da acceso al vector ... ¿Depende del compilador? Estoy tratando de buscar información sobre esto pero no encontré nada
AZTECCO

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.