Réorganiser une matrice, deux fois


20

On vous donne un carré matrice , et une liste (ou vecteur) de longueur contenant les nombres à (ou à ). Votre tâche consiste à réorganiser les colonnes et les lignes de la matrice selon l'ordre spécifié en .n×nUNEun1n0n-1UNEu

Autrement dit, on va construire une matrice où le -ième élément est le -ième élément de . Vous devez également sortir l'inverse de cette action; Autrement dit, la (i, j) -ième élément de finira à la position dans une nouvelle matrice .B(je,j)(u(je),u(j))UNEUNE(u(je),u(j))C

Par exemple, étant donné

UNE=[111213212223313233],u=[312]

la sortie doit être

B=[333132131112232122],C=[222321323331121311]

Vous pouvez accepter l'entrée et la sortie via l'une des méthodes d'E / S par défaut. Vous n'avez pas besoin de spécifier quelle matrice est ou , tant que vous sortez les deux. Vous pouvez supposer que ne contient que des entiers positifs et vous pouvez utiliser une indexation basée sur 1 ou 0 pour . Vous devez prendre en charge les matrices jusqu'à au moins la taille .BCUNEu64×64

Exemple

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


Pouvons-nous sortir sans la ligne vide ici , c'est-à-dire comme ça ? (il n'y a pas d'ambiguïté) Ou, à défaut, utiliser 0comme séparateur?
Luis Mendo

@LuisMendo Bien sûr, pas de problème.
Sanchises

Une indexation 1 est-elle requise pour cela? Pouvons-nous utiliser l'indexation 0 et la saisie u = [2, 0, 1]?
Value Ink

@ValueInk Voir la première phrase, [...] contenant les nombres 1 à n (ou 0 à n − 1)
Sanchises

Réponses:



6

MATL , 15 13 octets

t3$)&Gw&St3$)

Entrées u, alors A.

Sorties B, puis Csans séparateur, car il n'y a pas d'ambiguïté.

Essayez-le en ligne!

Explication

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

Octave , 33 octets

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

Essayez-le en ligne!

Merci à Luis d' avoir corrigé une erreur et économisé plusieurs octets!

L'indexation de base fonctionne ici pour les deux tâches, en définissant un vecteur v égal à la permutation qui annule u . Autrement dit, si u=(3,1,2) alors le premier élément de v est 2, puisque 1 est dans la deuxième position de u . Ceci est accompli avec la fonction de tri d'Octave .


5

Python 3 avec numpy, 51 45 octets

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

Essayez-le en ligne!

-6 octets grâce à @xnor

La fonction prend deux arguments: une numpymatrice et un vecteur de permutation ayant des valeurs de 0 à n-1 .



@xnor Merci! Je sentais que cela pouvait être raccourci d'une manière ou d'une autre, mais l'idée d'utiliser une forboucle n'était pas venue à l'esprit.
Joel




3

J , 19 octets

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

Essayez-le en ligne!

  • Verbe principal ]/:~"1/:
    • Le plus à droite /:trie l'argument gauche (matrice) selon l'ordre qui trierait l'argument de droite (ordre spécifié). Cela trie les lignes.
    • Maintenant, ce résultat est à /:~"1nouveau trié selon l'ordre spécifié ]. Mais cette fois, nous trions avec le rang 1, c'est-à-dire que nous trions chaque ligne, ce qui a pour effet de trier les colonnes.
  • ],:/:Nous appliquons ce qui précède en utilisant à la fois la commande spécifiée ]et la note supérieure de la commande spécifiée /:. Cela nous donne les 2 résultats que nous voulons.

Agréable! Je pensais à appliquer le tri + transposition à deux reprises, mais je finirai plus longtemps.
Galen Ivanov

uest autorisé à être basé sur 0, donc sort ( /:) pourrait être indexé ( {) avec des
arguments

3

JavaScript (Node.js) , 77 70 68 octets

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

Essayez-le en ligne!


Il m'a fallu une minute pour comprendre ce qui vétait. C'est bien comment vous avez trouvé une utilisation pour l'échec silencieux en mode non strict de l'affectation de propriété à une valeur primitive, et que vous l'avez utilisé pour votre cas de base de récursivité.
Patrick Roberts

3

APL (Dyalog Extended) , 12 octets SBCS

uUNECB

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

Essayez-le en ligne!

u[3,1,2]

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

⍋¨ permutation-inversion de chacun; [[2,3,1],[2,3,1]]
 puis se
⍮⍨ juxtaposent à lui-même[[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]



UNE
¨


3

J , 17 16 15 14 octets

-1 grâce à @Jonah

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

Essayez-le en ligne!


1
Agréable! Vous pouvez descendre à 14 avec ([{"1{)~(,:/:): Essayez-le en ligne!
Jonah

Btw, question aléatoire: je vous ai remarqué (très bien) au golf en J, APL et K. Curieux que vous préférez dans l'ensemble? Je me souviens aussi que vous aviez dit que vous utilisiez K professionnellement, est-ce que je me souviens de cela, n'est-ce pas?
Jonah

@Jonah si je dois en choisir un, ce serait certainement k (merci de me cingler dans le chat k si vous voulez connaître les raisons), mais j'aime jouer au golf dans toutes les langues du tableau. malheureusement, je ne fais pas partie des quelques chanceux qui peuvent avoir un emploi en langue k
ngn

2

Fusain , 24 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. 0 indexé. Remarque: Espace de fin. Explication:

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

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

Essayez-le en ligne!




1

Gelée ,  12 11  13 octets

+2 :( pour corriger les cas où B = C

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

Un lien dyadique acceptant une liste de listes, A( npar n), sur la gauche et une liste des premiers nnombres entiers sur le côté droit u, ce qui donne une liste de listes de listes, [B, C].

Essayez-le en ligne!

Comment?

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

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

iasc renvoie des index pour trier son argument.


1

Nettoyer , 91 octets

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

Essayez-le en ligne!

Définit $ :: {{a}} [Int] -> [{{a}}](utilisé avec a = Int) la prise d'un tableau de tableaux et une liste d'index de base zéro, renvoyant une liste de tableaux de tableaux contenant B et C.


1

Python 3 , 91 octets

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

Essayez-le en ligne!

Prend les paramètres sous forme de liste 2D et 1D et renvoie une liste contenant deux listes 2D B et C. Je ne sais pas s'il existe un moyen plus propre de faire toutes les boucles for.


1

C ++ (gcc) , 148 142 octets

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

Essayez-le en ligne!

Merci à la suggestion de @ceilingcat d'utiliser #import <queue> au lieu de <vector> qui apporte mystérieusement std :: vector


@ceilingcat maintenant je vois que la file d'attente d'importation me donne accès au vecteur. Est-ce que le compilateur dépend? J'essaie de rechercher des informations à ce sujet mais je n'ai rien trouvé
AZTECCO

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.