重构字形矩阵


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

相关挑战

Answers:


7

果冻,18 13字节

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

将行数,列数和平面列表作为单独的命令行参数。

我的代码几乎与孪生挑战中的代码相同。唯一的区别是附加的(反转索引的排列)和的s(将输出拆分为2D数组)。

在线尝试!


4

MATL,29个字节

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

输入heightwidthvector由换行分离。

这在我对相关挑战的回答中重用了部分代码。

在线尝试!

说明

:!      % 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.)

还使用倾斜副词/.为在J执行zigzagify 答案从该挑战

用法

输入与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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.