行列を2回並べ替える


20

あなたが正方形与えられる行列、リスト(またはベクトル)長さの数を含む介して(またはを介して)。タスクは、指定された順序に従って行列列行を並べ替えることです。n×nAun1n0n1Au

つまり、あなたがマトリックス構築物であろう番目の要素である番目の要素。このアクションの逆も出力する必要があります。つまり、の(i、j)番目の要素位置してしまう新しい行列にCB(i,j)(u(i),u(j))AA(u(i),u(j))C

たとえば、

A=[111213212223313233],u=[312]

出力は

B=[333132131112232122],C=[222321323331121311]

デフォルトのI / Oメソッドのいずれかを介して入力および出力を取得できます。両方を出力する限り、どちらの行列がBまたはCであるかを指定する必要はありません。Aは正の整数のみが含まれていると想定でき、uは1または0ベースのインデックスを使用できます。少なくともサイズ64×64までの行列をサポートする必要があります。

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


我々出力することができ、ここで空行なし、である、このように?(あいまいさはありません)または、それが失敗した場合0、セパレータとして使用しますか?
ルイスメンドー

@LuisMendoもちろん問題ありません。
Sanchises

これには1インデックスが必要ですか?0インデックスと入力を使用できますu = [2, 0, 1]か?
バリューインク

@ValueInk 1〜n (または
0〜n

回答:



6

MATL15 13バイト

t3$)&Gw&St3$)

u次に入力しAます。

出力はB、次いで、C分離することなく、などの曖昧がありません。

オンラインでお試しください!

説明

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

オクターブ、33バイト

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

オンラインでお試しください!

エラーを修正し、数バイトを節約してくれたLuisに感謝します!

ここでは、uを元に戻す順列に等しいベクトルv定義することにより、両方のタスクで基本的なインデックス付けが機能します。場合すなわち、uは= 3 1 2 その後の最初の要素vが 1の第二の位置にあるので、2であるU。これは、Octaveのソート機能で実現されます。あなたはあなたは=312vあなたは


5

Pythonの3 numpyのと、51の 45バイト

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

オンラインでお試しください!

@xnorのおかげで-6バイト

関数は2つの引数を取る:numpyマトリックスと置換ベクトルは、の値を有する0までn1



@xnorありがとう!何らかの方法で短縮できると感じましたが、for-ループを使用するという考えは思いつきませんでした。
ジョエル




3

J、19バイト

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

オンラインでお試しください!

  • 主動詞 ]/:~"1/:
    • 右側/:は、右側の引数を並べ替える順序(指定された順序)に従って、左側の引数(行列)を並べ替えます。これにより行がソートされます。
    • その結果/:~"1は、指定された順序に従って再びソートされます]。しかし、今回はランク1でソートしています。つまり、各行をソートしています。これは列をソートする効果があります。
  • ],:/:指定された順序と指定された順序]グレードアップの両方を使用して上記を適用します/:。これにより、必要な2つの結果が得られます。

いいね!sort + transposeを2回適用することを考えていましたが、最終的には長くなります。
ガレンイワノフ

uことが許される0ベースなので、ソート(は/:)インデックス(可能性が{スワップ引数付き)
NGN

3

JavaScript(Node.js)77 70 68バイト

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

オンラインでお試しください!


それが何であるかを理解するのに1分かかりましたv。プリミティブ値へのプロパティ割り当ての非厳密モードのサイレント障害の使用法を見つけて、それを再帰ベースケースに使用する方法はきちんとしています。
パトリックロバーツ

3

APL(Dyalog Extended)、12 バイトSBCS

完全なプログラム。プロンプトu and then A. Prints C next to B, separated by two spaces

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

Try it online!

 prompt for u; [3,1,2]

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

⍋¨ permutation-inversion of each; [[2,3,1],[2,3,1]]
 then
⍮⍨ juxtapose with itself [[[2,3,1],[2,3,1]],[[3,1,2],[3,1,2]]]

 reorder
 the value of
A as inputted
¨ using each pair as a set of orders, one order per axis


3

J, 17 16 15 14 bytes

-1 thanks to @Jonah

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

Try it online!


1
いいね!あなたが14に取り掛かることができます([{"1{)~(,:/:)オンラインそれをお試しください!
ジョナ

Btw, random question: I noticed you golf (very well) in J, APL and K. Curious which you prefer overall? Also I seem to recall you saying you used K professionally, am I remembering that right?
Jonah

@Jonahを選択する必要がある場合、それは間違いなくk(理由を知りたい場合はkチャットでpingを送信)ですが、すべての配列言語でゴルフを楽しんでいます。悲しいことに、私はk-言語の仕事を持つことができる幸運な数人の一人ではありません
ngn

2

Charcoal, 24 bytes

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

Try it online! Link is to verbose version of code. 0-indexed. Note: Trailing space. Explanation:

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

Try it online!




1

Jelly,  12 11  13 bytes

+2 :( to fix cases when B = C

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

A dyadic Link accepting a list of lists, A (n by n), on the left and a list of the first n integers on the right, u, which yields a list of lists of lists, [B, C].

Try it online!

How?

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

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

iasc 引数をソートするためのインデックスを返します。


1

クリーン、91バイト

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

オンラインでお試しください!

配列の配列とゼロベースのインデックスのリストを取り、BおよびCを含む配列の配列のリストを返すことを定義します$ :: {{a}} [Int] -> [{{a}}](で使用しますa = Int)。


1

Python 3、91バイト

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

オンラインでお試しください!

パラメーターを2Dおよび1Dリストとして取得し、2つの2DリストBおよびCを含むリストを返します。すべてのforループを実行するよりクリーンな方法があるかどうかはわかりません。


1

C ++(gcc)148 142バイト

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

オンラインでお試しください!

不思議なことにstd :: vectorをもたらす<vector>の代わりに#import <queue>を使用する@ceilingcatの提案に感謝します。


@ceilingcatを使用すると、インポートキューからベクターにアクセスできることがわかります。コンパイラに依存していますか?これに関する情報を検索しようとしていますが、何も見つかりませんでした
AZTECCO

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.