Перередагуйте матрицю двічі


20

Вам надано квадрат матриці та список (або вектор) довжиною що містить числа від до (або до ). Ваше завдання - переупорядкувати стовпці та рядки матриці A у порядку, визначеному u .n×nAun1n0n1Au

Тобто, ви побудувати матрицю B , де (i,j) -й елемент є (u(i),u(j)) -й елемент A . Ви також повинні вивести зворотну дію; тобто, (I, J) -й елемент A буде в кінцевому підсумку в положенні (u(i),u(j)) в нових матрицях C .

Наприклад, задавши

A=[111213212223313233],u=[312]

вихід повинен бути

B=[333132131112232122],C=[222321323331121311]

Ви можете приймати введення та виведення за допомогою будь-якого з методів вводу / виводу за замовчуванням. Не потрібно вказувати, яка матриця - або , доки ви виходите обидві. Ви можете припустити, що містить лише додатні цілі числа, а ви можете використовувати індексацію на основі 1 або 0 для . Ви повинні підтримувати матриці розміром принаймні .БСАu64×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 . Це здійснюється завдяки функції сортування Октава .


5

Python 3 з numpy, 51 45 байт

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

Спробуйте в Інтернеті!

-6 байт завдяки @xnor

Функція бере два аргументи: numpyматриця та вектор перестановки, що мають значення від 0 до n1 .



@xnor Дякую! Я відчував, що це можна якось скоротити, але ідея використовувати for-loop не прийшла мені в голову.
Джоель




3

J , 19 байт

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

Спробуйте в Інтернеті!

  • Основний дієслово ]/:~"1/:
    • Права більшість /:сортує лівий аргумент (матрицю) відповідно до порядку, який би сортував правий arg (вказаний порядок). Це сортує рядки.
    • Тепер цей результат /:~"1знову відсортуйте за вказаним порядком ]. Але цього разу ми сортуємо з рангом 1, тобто ми сортуємо кожен рядок, що має ефект сортування стовпців.
  • ],:/:Ми застосовуємо вище, використовуючи як вказаний порядок, так ]і ступінь підвищення вказаного замовлення /:. Це дає нам 2 бажані результати.

Приємно! Я думав про те, щоб застосувати sort + transpose двічі, але закінчуватимусь довше.
Гален Іванов

uдозволено базуватись на 0, тому sort ( /:) може бути індексуванням ( {) із заміненими аргументами
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]]

Спробуйте в Інтернеті!


Мені знадобилася хвилина, щоб зрозуміти, що таке v. Це добре, як ви знайшли застосування для не строгого режиму мовчазного відмови присвоєння властивості примітивному значенню, і використовували це для базового випадку рекурсії.
Патрік Робертс


3

J , 17 16 15 14 байт

-1 дякую @Jonah

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

Спробуйте в Інтернеті!


1
Приємно! Ви можете прийти до 14 за допомогою ([{"1{)~(,:/:): Спробуйте в Інтернеті!
Іона

Btw, випадковий запитання: Я помітив, що ви гольф (дуже добре) в J, APL та K. Цікаво, якому ви віддаєте перевагу в цілому? Крім того, я нагадаю, що ви говорили, що ви використовували K професійно, я пам'ятаю це правильно?
Іона

@Jonah, якщо я повинен вибрати один, це, безумовно, буде k (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( 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 список і повертає список, що містить два двовимірні списки 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.