행렬을 두 번 재정렬


20

넌 스퀘어 주어진 행렬 하고리스트 (또는 벡터) 길이 숫자 함유 통해 (또는 내지 ). 당신의 작업은 열 순서를 변경하는 것입니다 행렬의 행 지정된 순서에 따라 .×에이101에이

되었으므로 매트릭스 구성 것이다 여기서, 번째 요소는 인 의 번째 요소 . 또한이 동작의 역을 출력해야합니다. 즉,의 (i, j) 번째 원소 위치에서 끝날 것이다 새로운 행렬에서 .(나는,j)((나는),(j))에이에이((나는),(j))기음

예를 들어, 주어진

에이=[111213212223313233],=[12]

출력은

=[333132131112232122],기음=[222321323331121311]

기본 I / O 방법을 통해 입력 및 출력을 수행 할 수 있습니다. 둘 다 출력하는 한 또는 C 인 행렬을 지정할 필요가 없습니다 . A 에 양의 정수만 포함 한다고 가정 하고 u에 1 또는 0 기반 색인을 사용할 수 있습니다 . 최소한 크기 64 \ times 64 까지의 행렬을 지원해야합니다 .기음에이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구분 기호로 사용 합니까?
Luis Mendo

@LuisMendo 문제 없습니다.
Sanchises

이를 위해 1- 인덱싱이 필요합니까? 0 인덱싱과 입력을 사용할 수 있습니까 u = [2, 0, 1]?
가치 잉크

@ValueInk 첫 번째 문장 참조 [...] 1에서 n까지 (또는 0에서 n-1까지)
Sanchises

답변:



6

MATL , 15 13 바이트

t3$)&Gw&St3$)

입력 uA.

출력은 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 에게 감사 합니다!

기본 인덱싱은 를 취소하는 순열과 같은 벡터 를 정의하여 두 작업 모두에서 작동합니다 . 즉, 이면 의 첫 번째 요소 는 2입니다. 1은 의 두 번째 위치에 있기 때문 입니다. 이는 Octave의 정렬 기능으로 수행됩니다.V=(,1,2)V


5

numpy가있는 Python 3 , 51 45 바이트

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

온라인으로 사용해보십시오!

@xnor 덕분에 -6 바이트

이 함수는 numpy행렬과 0 에서 1 사이의 값을 갖는 순열 벡터의 두 가지 인수 를 사용합니다 .



@xnor 감사합니다! 나는 그것이 어떤 식 으로든 단축 될 수 있다고 생각했지만- for루프 를 사용한다는 생각이 마음에 들지 않았습니다.
요엘




3

J , 19 바이트

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

온라인으로 사용해보십시오!

  • 주요 동사 ]/:~"1/:
    • 오른쪽 /:은 오른쪽 arg (지정된 순서)를 정렬하는 순서에 따라 왼쪽 arg (매트릭스)를 정렬합니다. 행을 정렬합니다.
    • 이제 /:~"1지정된 순서에 따라 결과가 다시 정렬 됩니다 ]. 그러나 이번에는 순위 1을 기준으로 정렬합니다. 즉, 각 행을 정렬하므로 열을 정렬하는 효과가 있습니다.
  • ],:/:우리는 명시된 순서 ]와 지정된 순서 의 등급 을 모두 사용하여 위의 내용을 적용 합니다 /:. 이것은 우리가 원하는 두 가지 결과를 제공합니다.

좋은! sort + transpose를 두 번 적용하려고 생각했지만 결국 더 길어질 것입니다.
Galen Ivanov

u는 0을 기준으로 /:할 수 있으므로 sort ( )는 {스왑 된 인수 로 색인화 ( ) 될 수 있습니다
ngn



3

J , 17 16 15 14 바이트

@Jonah 덕분에 -1

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

온라인으로 사용해보십시오!


1
좋은! 당신은 14까지 얻을 수 있습니다 ([{"1{)~(,:/:): 온라인으로보십시오!
요나

Btw, 무작위 질문 : J, APL 및 K에서 골프 (매우 잘)를 보았습니다. 전반적으로 선호하는 궁금한 점이 있습니까? 또한 K를 전문적으로 사용했다는 것을 기억하는 것 같습니다.
요나

@Jonah 내가 하나를 선택해야한다면, 그것은 분명히 k가 될 것입니다 ( 이유를 알고 싶다면 k 채팅 에서 ping pls ), 그러나 나는 모든 배열 언어로 골프를 즐깁니다. 슬프게도, 나는 k 언어를 할 수있는 행운의 소수의 사람이 아닙니다
ngn

2

, 24 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 인덱스가 0입니다. 참고 : 후행 공간. 설명:

    η                       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




1

젤리 ,  12 11  13 바이트

+2 : (B = C 인 경우 문제 해결

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

왼쪽에있는 목록 목록 A( nby n)과 n오른쪽에있는 첫 번째 정수 목록을 허용하는 dyadic Link는 목록 목록 u을 생성합니다 [B, C].

온라인으로 사용해보십시오!

방법?

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

온라인으로 사용해보십시오!

배열의 배열과 0부터 시작하는 인덱스 목록을 가져 와서 B와 C를 포함하는 배열의 배열 목록을 반환하도록 정의합니다 $ :: {{a}} [Int] -> [{{a}}](와 함께 사용 a = Int).


1

파이썬 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 목록으로 가져와 두 개의 2D 목록 B와 C가 포함 된 목록을 반환합니다. 모든 for 루프를 수행하는 더 확실한 방법이 있는지 확실하지 않습니다.


1

C ++ (gcc) , 148142 바이트

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

온라인으로 사용해보십시오!

@ceilingcat 제안 덕분에 신비롭게 std :: vector를 가져 오는 <vector> 대신 #import <queue>를 사용하는 것이 좋습니다


@ceilingcat 이제 가져 오기 대기열이 벡터에 액세스 할 수 있음을 알 수 있습니다. 컴파일러에 따라 다릅니 까? 이것에 관한 정보를 검색하려고하는데 아무것도 찾지 못했습니다
AZTECCO

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.