Zmień kolejność macierzy dwukrotnie

20

Podane są kwadratu macierzy oraz listy (lub wektor) o długości zawierające numery przez (lub przez ). Twoim zadaniem jest zmiana kolejności kolumn i wierszy macierzy zgodnie z kolejnością określoną w .n×nAun1n0n1Au

Oznacza to, że można skonstruować macierzy , gdzie -ty element to -ty element . Powinieneś także wypisać odwrotność tej akcji; to znaczy, że (i, j) -ty element kończy się w położeniu w nowej macierzy .B(i,j)(u(i),u(j))AA(u(i),u(j))C

Na przykład, biorąc pod uwagę

A=[111213212223313233],u=[312]

wynikiem powinno być

B=[333132131112232122],C=[222321323331121311]

Wejścia i wyjścia można pobierać dowolną z domyślnych metod we / wy. Nie musisz określać, która macierz jest lub , o ile wypisujesz oba. Możesz założyć, że zawiera tylko dodatnie liczby całkowite i możesz użyć indeksowania opartego na 1 lub 0 dla . Musisz obsługiwać macierze do rozmiaru co najmniej .BCAu64×64

Przykład

===== 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
źródło
Piaskownica
Sanchises
Czy możemy tutaj wyprowadzać wyjście bez pustej linii , czyli tak ? (nie ma dwuznaczności) A jeśli nie, użyj 0jako separatora?
Luis Mendo
@LuisMendo Na pewno nie ma problemu.
Sanchises
Czy do tego jest wymagane 1-indeksowanie? Czy możemy korzystać z indeksowania 0 i wprowadzania danych u = [2, 0, 1]?
Wartość tuszu
@ValueInk Zobacz pierwsze zdanie, [...] zawierające liczby od 1 do n (lub od 0 do n-1)
Sanchises

Odpowiedzi:

6

R , 42 bajty

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

Wypróbuj online!

Przyjmuje Ajako matrixindeksy oparte na 1 i 1 o.

Giuseppe
źródło
6

MATL , 15 13 bajtów

t3$)&Gw&St3$)

Wejścia uzatem A.

Wyjścia B, a następnie Cbez separatora, ponieważ nie ma dwuznaczności.

Wypróbuj online!

Wyjaśnienie

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
źródło
5

Oktawa , 33 bajty

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

Wypróbuj online!

Dziękujemy Luisowi za naprawienie błędu i zapisanie kilku bajtów!

Podstawowe indeksowanie działa tutaj dla obu zadań, definiując wektor v równy permutacji, która cofa u . To znaczy, jeśli u=(3,1,2) to pierwszy element v wynosi 2, ponieważ 1 znajduje się w drugiej pozycji u . Dokonuje się tego za pomocą funkcji sortowania Octave .

FryAmTheEggman
źródło
5

Python 3 z numpy, 51 45 bajtów

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

Wypróbuj online!

-6 bajtów dzięki @xnor

Funkcja przyjmuje dwa argumenty: numpymacierz i wektor permutacji o wartościach od 0 do n1 .

Joel
źródło
@xnor Thanks! Czułem, że można go w jakiś sposób skrócić, ale pomysł użycia forpętli nie przyszedł mi do głowy.
Joel
4

PowerShell , 78 73 71 bajtów

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

Wypróbuj online .

Andrei Odegov
źródło
3

J , 19 bajtów

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

Wypróbuj online!

  • Główny czasownik ]/:~"1/:
    • Prawy najbardziej /:sortuje lewy arg (macierz) zgodnie z kolejnością, która posortuje prawy arg (określona kolejność). To sortuje wiersze.
    • Teraz wynik jest sortowany /:~"1ponownie zgodnie z podaną kolejnością ]. Ale tym razem sortujemy według rangi 1, tzn. Sortujemy każdy wiersz, co powoduje sortowanie kolumn.
  • ],:/:Stosujemy powyższe, stosując zarówno określone zamówienie, jak ]i ocenę podanego zamówienia /:. To daje nam 2 wyniki, które chcemy.
Jonasz
źródło
Ładny! Myślałem o zastosowaniu sort + transpozycja dwa razy, ale skończy się to dłużej.
Galen Iwanow
umoże być oparty na 0, więc sort ( /:) może indeksować ( {) z zamienionymi argumentami
ngn
3

JavaScript (Node.js) , 77 70 68 bajtów

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

Wypróbuj online!

James
źródło
Zrozumienie, co vbyło, zajęło mi minutę . To fajne, jak znalazłeś zastosowanie do cichego niepowodzenia przypisania właściwości w trybie nieokreślonym do prymitywnej wartości i wykorzystałeś to w przypadku podstawowej rekurencji.
Patrick Roberts
3

APL (Dyalog Extended) , 12 bajtów SBCS

uACB

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

Wypróbuj online!

u[3,1,2]

⍮⍨ zestawienie selfie; [[3,1,2],[3,1,2]]

⍋¨ inwersja permutacji każdego; [[2,3,1],[2,3,1]]
 następnie
⍮⍨ zestaw ze sobą[[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]



A
¨

Adám
źródło
3

J , 17 16 15 14 bajtów

-1 dzięki @Jonah

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

Wypróbuj online!

ngn
źródło
1
Ładny! Możesz przejść do 14 lat dzięki ([{"1{)~(,:/:): Wypróbuj online!
Jonasz
Btw, losowe pytanie: Zauważyłem, że grasz w golfa (bardzo dobrze) w J, APL i K. Ciekawy, który ogólnie wolisz? Wydaje mi się również, że pamiętam, jak profesjonalnie użyłeś K, czy pamiętam to, prawda?
Jonasz
@Jonah, jeśli muszę wybrać jeden, to na pewno byłby k (proszę pingować mnie na czacie k, jeśli chcesz poznać powody), ale lubię grać w golfa we wszystkich językach tablicy. niestety, nie jestem jednym z nielicznych, którzy mogą mieć pracę w języku k
ngn
2

Węgiel drzewny , 24 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. 0-indeksowane. Uwaga: końcowe miejsce. Wyjaśnienie:

    η                       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
źródło
2

Kotlin , 213 bajtów

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

Wypróbuj online!

JohnWells
źródło
1

Galaretka ,  12 11  13 bajtów

+2 :(, aby naprawić przypadki, gdy B = C

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

Dwójkowym link przyjmując listę list A( nprzez n), po lewej stronie, a także wykaz pierwszych nliczb po prawej stronie u, co daje listę list list [B, C].

Wypróbuj online!

W jaki sposób?

ṭþ`œị¥@Ƭị@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
źródło
1

q, 26 bajtów

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

iasc zwraca indeksy, aby posortować argument.

skeevey
źródło
1

Czysty , 91 bajtów

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

Wypróbuj online!

Definiuje $ :: {{a}} [Int] -> [{{a}}](używane z a = Int) pobieranie tablicy tablic i listy indeksów zerowych, zwracając listę tablic tablic zawierających B i C.

Obrzydliwe
źródło
1

Python 3 , 91 bajtów

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

Wypróbuj online!

Pobiera parametry jako listę 2D i 1D i zwraca listę zawierającą dwie listy 2D B i C. Nie jestem pewien, czy istnieje prostszy sposób wykonywania wszystkich pętli for.

Matthew Jensen
źródło
1

C ++ (gcc) , 148 142 bajtów

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

Wypróbuj online!

Dzięki sugestii @ceilingcat, aby użyć #import <kolejka> zamiast <vector>, co w tajemniczy sposób przynosi std :: vector

AZTECCO
źródło
@ceilingcat teraz widzę, że kolejka importu daje mi dostęp do wektora. Czy to zależy od kompilatora? Próbuję wyszukać informacje na ten temat, ale nic nie znalazłem
AZTECCO,