Реконструюйте зигзагіфіковану матрицю


18

Як частина алгоритму стиснення, стандарт JPEG розгортає матрицю у вектор уздовж антидіагоналів змінного напрямку:

введіть тут опис зображення

Ваше завдання - взяти розкручений вектор разом з розмірами матриці та реконструювати відповідну матрицю. Як приклад:

[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3], 4, 3

повинні врожаї

[1 2 3 4
 5 6 7 8
 9 1 2 3]

тоді як розміри 6, 2дають

[1 2 6 3 1 2
 5 9 4 7 8 3]

Правила

Ви можете вибрати лише один з вимірювань як вхідний. Окремі введення можна взяти в будь-якому порядку. Ви можете припустити, що ширина та висота позитивні та дійсні для заданої довжини вектора.

Можна припустити, що векторні елементи мають натуральні цілі, менші ніж 10.

Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та вивівши результат через STDOUT (або найближчу альтернативу), значення повернення функції або параметр функції (out).

Вектор введення може бути наданий у будь-якому зручному, однозначному, плоскому списку чи рядковому форматі.

Вихідна матриця може бути в будь-якому зручному, однозначному, вкладеному списку або форматі рядка, або як плоский список разом з обома розмірами матриці. (Або, звичайно, як тип матриці, якщо у вас є мова.)

Діють стандартні правила .

Випробування

Кожен тестовий випадок має форму vector width height => matrix.

[1] 1 1                        => [[1]]
[1 2 3 1] 2 2                  => [[1 2] [3 1]]
[1 2 3 1] 4 1                  => [[1 2 3 1]]
[1 2 5 9 6 3 4 7 1 2 8 3] 3 4  => [[1 2 3] [5 6 4] [9 7 8] [1 2 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 4 3  => [[1 2 3 4] [5 6 7 8] [9 1 2 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 6 2  => [[1 2 6 3 1 2] [5 9 4 7 8 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 12 1 => [[1 2 5 9 6 3 4 7 1 2 8 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 1 12 => [[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]]

Супутні виклики

Відповіді:


7

Желе, 18 13 байт

pS€żị"¥pỤỤị⁵s

Кількість рядків, кількість стовпців і плоский список приймає як окремі аргументи командного рядка.

Мій код майже ідентичний тому, який є у виклику близнюків . Єдині відмінності - це додаткова (яка інвертує перестановку індексів) та an s(для розділення виводу на 2D масив).

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


4

MATL , 29 байт

:!i:+-1y^8MtsQ/*-X:4#S2$S1GZC

Введення height, width, vectorрозділені символами нового рядка.

Це повторно використовує частину коду в моїй відповіді на пов'язаний виклик .

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

Пояснення

:!      % take number of rows, r, as input. Generate column vector [1;2;...;r]
i:      % take number of columns, c, as input. Generate row vector [1,2,...,c] 
+       % add with broadcast. Gives 2D array
-1      % push -1
y^      % duplicate previous 2D array. Compute -1 raised to that
8M      % push [1;2;...;r] again
tsQ/    % divide by its sum plus 1
*       % multiply
-       % subtract
X:      % linearize 2D array into column array
4#S     % sort and push the indices of the sorting. Gives a column vector
2$S     % take vector as input. Sort it according to previous column vector
1G      % push r
ZC      % reshape into columns of r elements

0

J, 24 байти

]$({~[:/:@;[:<@|.`</.i.)

Також використовує похиле наріччя /.для виконання zigzagify як в J відповіді від цієї задачі .

Використання

Введення проводиться з масивом на LHS та розмірами [height, width]на RHS.

   f =: ]$({~[:/:@;[:<@|.`</.i.)
   1 f 1 1
1
   1 2 3 1 f 2 2
1 2
3 1
   1 2 5 9 6 3 4 7 1 2 8 3 f 4 3
1 2 3
5 6 4
9 7 8
1 2 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 3 4
1 2 3 4
5 6 7 8
9 1 2 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 2 6
1 2 6 3 1 2
5 9 4 7 8 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 1 12
1 2 5 9 6 3 4 7 1 2 8 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 12 1
1
2
5
9
6
3
4
7
1
2
8
3

Пояснення

]$({~[:/:@;[:<@|.`</.i.)  Input: list A (LHS), dimensions D (RHS)
                     i.   Range shaped to D
           [:<@|.`</.     Zigzagify that matrix
     [:   ;               Raze the boxes to get a zigzagify permutation
       /:@                Invert that permutation to get an unzigzagify permutation
   {~                     Apply that permutation to A
]                         Get D
 $                        Shape that permutation to D and return
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.