ジグザグ化された行列を再構築する


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]

ルール

入力としてディメンションの1つのみを選択することもできます。個々の入力は任意の順序で取得できます。幅と高さが正であり、指定されたベクトルの長さに対して有効であると仮定できます。

ベクトル要素はより小さい正の整数であると仮定でき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

行数、列数、フラットリストを個別のコマンドライン引数として受け取ります。

私のコードはツインチャレンジのコードとほとんど同じです。唯一の違いは、追加(インデックスの順列を逆にする)とs(出力を2D配列に分割する)です。

オンラインでお試しください!


4

MATL、29バイト

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

入力はheight、改行widthvector区切られた、です。

これは関連する挑戦への私の答えのコードの一部を再利用ます。

オンラインでお試しください!

説明

:!      % 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 回答のようにジグザジフを実行ます。

使用法

入力は、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.