Ordnen Sie eine Matrix zweimal neu an


20

Sie erhalten ein Quadrat Matrix und eine Liste (oder einen Vektor) der Länge mit den Zahlen bis (oder bis ). Ihre Aufgabe ist es, die Spalten und Zeilen der Matrix in der in angegebenen Reihenfolge neu anzuordnen .n×nEINun1n0n-1A uEINu

Das heißt, Sie konstruieren eine Matrix in der das -te Element das -te Element von . Sie sollten auch die Umkehrung dieser Aktion ausgeben. das heißt, das (i, j) -te Element von wird an der Position am Ende in einer neuen Matrix .B(ich,j)(u(ich),u(j))EINEIN(u(ich),u(j))C

Beispiel:

A=[111213212223313233],u=[312]

Die Ausgabe sollte

B=[333132131112232122],C=[222321323331121311]

Sie können Eingaben und Ausgaben über eine der Standard-E / A-Methoden vornehmen. Sie müssen nicht angeben, welche Matrix oder , solange Sie beide ausgeben. Sie können annehmen, dass nur positive ganze Zahlen enthält, und Sie können die 1- oder 0-basierte Indizierung für . Sie müssen Matrizen mit einer Größe von mindestens .BCAu64×64

Beispiel

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


Können wir ausgegeben , ohne die leere Zeile hier , das ist wie das ? (es gibt keine Mehrdeutigkeit) Oder, falls dies nicht der Fall ist, 0als Trennzeichen verwenden?
Luis Mendo

@ LuisMendo Sicher kein Problem.
Sanchises,

Ist hierfür eine 1-Indizierung erforderlich? Können wir 0-Indizierung und Eingabe verwenden u = [2, 0, 1]?
Value Ink

@ValueInk Siehe den ersten [...]
Sanchises

Antworten:



6

MATL , 15 13 Bytes

t3$)&Gw&St3$)

Eingänge u, dann A.

Ausgänge B, dann Cohne Trennzeichen, da keine Mehrdeutigkeit besteht.

Probieren Sie es online!

Erläuterung

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

Oktave , 33 Bytes

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

Probieren Sie es online!

Vielen Dank an Luis für die Korrektur eines Fehlers und das Speichern mehrerer Bytes!

Die grundlegende Indizierung funktioniert hier für beide Aufgaben, indem ein Vektor v definiert wird , der der Permutation entspricht, die u aufhebt . Das heißt, wenn u=(3,1,2) dann ist das erste Element von v 2, da 1 in der zweiten Position von u . Dies wird mit Oktaves erreicht Sortierfunktion.


5

Python 3 mit numpy, 51 45 Bytes

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

Probieren Sie es online!

-6 Bytes dank @xnor

Die Funktion akzeptiert zwei Argumente: eine numpyMatrix und einen Permutationsvektor mit Werten von 0 bis n-1 .



@ xnor Danke! Ich hatte das Gefühl, dass es auf irgendeine Weise verkürzt werden könnte, aber die Idee, eine forSchleife zu verwenden, kam mir nicht in den Sinn.
Joel




3

J , 19 Bytes

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

Probieren Sie es online!

  • Hauptverb ]/:~"1/:
    • Das am weitesten rechts stehende Argument /:sortiert das linke Argument (Matrix) in der Reihenfolge, in der das rechte Argument (angegebene Reihenfolge) sortiert wird. Dies sortiert die Zeilen.
    • Nun wird das Ergebnis /:~"1wieder in der angegebenen Reihenfolge sortiert ]. Aber diesmal sortieren wir mit Rang 1, dh wir sortieren jede Zeile, wodurch Spalten sortiert werden.
  • ],:/:Wir wenden das oben Genannte sowohl unter Verwendung der angegebenen Bestellung ]als auch der Bewertung der angegebenen Bestellung an /:. Dies gibt uns die 2 gewünschten Ergebnisse.

Nett! Ich habe darüber nachgedacht, sort + transpon zweimal anzuwenden, aber es wird länger dauern.
Galen Ivanov

udarf 0-basiert sein, also könnte sort ( /:) indexing ( {) with
swapped

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

Probieren Sie es online!


Ich brauchte eine Minute, um herauszufinden, was es vwar. Es ist ganz einfach, wie Sie eine Verwendung für den stillen Fehler des nicht strengen Modus bei der Zuweisung von Eigenschaften zu einem primitiven Wert gefunden und diese für Ihren Rekursionsgrundfall verwendet haben.
Patrick Roberts

3

APL (Dyalog Extended) , 12 Byte SBCS

uEINCB

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

Probieren Sie es online!

u[3,1,2]

⍮⍨ Gegenüberstellung-Selfie; [[3,1,2],[3,1,2]]

⍋¨ Permutation-Inversion von jedem; [[2,3,1],[2,3,1]]
 dann
⍮⍨ mit sich selbst gegenüberstellen[[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]



EIN
¨


3

J , 17 16 15 14 Bytes

-1 danke an @Jonah

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

Probieren Sie es online!


1
Nett! Sie können bis zu 14 mit bekommen ([{"1{)~(,:/:): Probieren Sie es online!
Jonah,

Übrigens, zufällige Frage: Mir ist aufgefallen, dass Sie in J, APL und K (sehr gut) Golf spielen. Neugierig, was Sie insgesamt bevorzugen? Ich erinnere mich auch an Sie, als Sie sagten, Sie hätten K professionell benutzt. Erinnere ich mich daran, oder?
Jonah,

@Jonah, wenn ich eine auswählen muss, wäre das definitiv k (bitte ping mich im k-Chat an, wenn du die Gründe wissen willst), aber ich spiele gerne in allen Array-Sprachen. leider bin ich nicht einer der wenigen Glücklichen , die einen k-Sprache Job haben kann
ngn

2

Kohle , 24 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. 0-indiziert. Hinweis: Leerzeichen am Ende. Erläuterung:

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

Probieren Sie es online!




1

Jelly ,  12 11  13 Bytes

+2 :(, um Fälle zu beheben, in denen B = C ist

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

Ein dyadischer Link, der eine Liste von Listen A( nvon n) auf der linken Seite und eine Liste der ersten nganzen Zahlen auf der rechten Seite akzeptiert u, die eine Liste von Listen von Listen ergibt [B, C].

Probieren Sie es online!

Wie?

ṭþ`œị¥@Ƭị@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 Gibt Indizes zurück, um das Argument zu sortieren.


1

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

Probieren Sie es online!

Definiert $ :: {{a}} [Int] -> [{{a}}](verwendet mit a = Int) das Aufnehmen eines Arrays von Arrays und einer Liste von nullbasierten Indizes und das Zurückgeben einer Liste von Arrays von Arrays, die B und C enthalten.


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

Probieren Sie es online!

Nimmt Parameter als 2D- und 1D-Liste und gibt eine Liste mit zwei 2D-Listen B und C zurück. Ich bin nicht sicher, ob es eine sauberere Möglichkeit gibt, alle for-Schleifen durchzuführen.


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

Probieren Sie es online!

Dank @ceilingcat Vorschlag, #import <queue> anstelle von <vector> zu verwenden, was auf mysteriöse Weise std :: vector bringt


@ceilingcat jetzt sehe ich, dass die Import-Warteschlange mir Zugriff auf Vektor gibt. Ist es vom Compiler abhängig? Ich versuche nach Informationen zu suchen, habe aber nichts gefunden
AZTECCO

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.