Переупорядочить матрицу, дважды


20

Вам дан квадрат матрицы и список (или вектор) длины содержащий числа от до (или от до ). Ваша задача - изменить порядок столбцов и строк матрицы в порядке, указанном в .N×NAUN1N0N-1AU

То есть, вы построить матрицу , где -й элемент является -й элемент . Вы также должны вывести обратное действие; то есть, (I, J) -й элемент будет в конечном итоге в положении в новых матрицах .В(я,J)(u(i),u(j))AA(u(i),u(j))C

Например, если

A=[111213212223313233],u=[312]

выходные данные должны быть

B=[333132131112232122],C=[222321323331121311]

Вы можете осуществлять ввод и вывод через любой из методов ввода / вывода по умолчанию. Вам не нужно указывать, какая матрица или , если вы выводите обе. Вы можете предполагать, что содержит только положительные целые числа, и вы можете использовать индексацию на основе 1 или 0 для . Вы должны поддерживать матрицы размером не менее .BCAu64×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 Конечно, нет проблем.
Санчиз

Требуется ли для этого 1-индексирование? Можем ли мы использовать 0-индексирование и ввод u = [2, 0, 1]?
Стоимость чернил

@ValueInk См. Первое предложение, [...] содержащее числа от 1 до n (или от 0 до n − 1)
Санчиз

Ответы:



6

MATL , 15 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)}

Попробуйте онлайн!

Спасибо Луису за исправление ошибки и сохранение нескольких байтов!

Базовое индексирование работает здесь для обеих задач, определяя вектор v равный перестановке, которая отменяет U . То есть, если Uзнак равно(3,1,2) то первый элемент v равен 2, поскольку 1 находится во второй позиции U . Это достигается с помощью функции сортировки Octave .


5

Python 3 с NumPy, 51 45 байт

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

Попробуйте онлайн!

-6 байт благодаря @xnor

Функция принимает два аргумента: numpyматрицу и вектор перестановок, имеющие значения от 0 до N-1 .



@xnor Спасибо! Я чувствовал, что его можно каким-то образом сократить, но идея использования for-loop не пришла мне в голову.
Джоэл




3

J , 19 байт

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

Попробуйте онлайн!

  • Основной глагол ]/:~"1/:
    • Самый правый /:сортирует левый аргумент (матрицу) в соответствии с порядком, в котором сортируется правый аргумент (указанный порядок). Это сортирует строки.
    • Теперь этот результат /:~"1снова сортируется в соответствии с указанным порядком ]. Но на этот раз мы сортируем с рангом 1, то есть сортируем каждую строку, что приводит к сортировке столбцов.
  • ],:/:Мы применяем вышеизложенное с использованием как указанного заказа, так ]и повышения уровня указанного заказа /:. Это дает нам 2 результата, которые мы хотим.

Ницца! Я думал о применении сортировки + транспонирования дважды, но закончится дольше.
Гален Иванов

uразрешено на основе 0, так что sort ( /:) может быть indexing ( {) с
помененными

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

Попробуйте онлайн!


Мне потребовалась минута, чтобы понять, что vбыло. Неплохо, как вы нашли использование в нестрогом режиме тихого сбоя присвоения свойства примитивному значению и использовали его для базового случая рекурсии.
Патрик Робертс


3

J , 17 16 15 14 байтов

-1 благодаря @Jonah

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

Попробуйте онлайн!


1
Ницца! Вы можете получить до 14 с ([{"1{)~(,:/:): Попробуйте онлайн!
Иона

Кстати, случайный вопрос: я заметил, что вы играете в гольф (очень хорошо) в J, APL и K. Любопытно, что вы предпочитаете в целом? Также я помню, что вы говорили, что использовали K профессионально, я правильно помню?
Иона

@Jonah, если я должен выбрать один, это определенно было бы k (пожалуйста, пингуйте меня в k чате, если вы хотите знать причины), но я действительно наслаждаюсь игрой в гольф на всех языках множества. к сожалению, я не из тех немногих счастливчиков, которые могут работать на к-языке
нгн

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( nпо n), на левой и список первых nчисел справа, 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]]

Попробуйте онлайн!

Определяет $ :: {{a}} [Int] -> [{{a}}](используется вместе с a = Int) получение массива массивов и списка индексов, начинающихся с нуля, возвращая список массивов массивов, содержащих B и C.


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 и возвращает список, содержащий два списка 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];}

Попробуйте онлайн!

Благодаря предложению @ceilingcat использовать #import <queue> вместо <vector>, что таинственным образом приводит к std :: vector


@ceilingcat теперь я вижу, что очередь импорта дает мне доступ к вектору .. Зависит ли это от компилятора? Я пытаюсь найти информацию об этом, но ничего не нашел
AZTECCO

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.