Zikzaklaştırılmış bir matrisi yeniden yapılandırın


18

Sıkıştırma algoritmasının bir parçası olarak, JPEG standardı, bir matrisi, dönüşümlü yönün antidiagonalleri boyunca bir vektöre açar:

resim açıklamasını buraya girin

Göreviniz, açılmamış vektörü matris boyutları ile birlikte almak ve karşılık gelen matrisi yeniden yapılandırmaktır. Örnek olarak:

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

vermeli

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

boyutları ise 6, 2verecek

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

kurallar

Boyutlardan yalnızca birini giriş olarak almayı seçebilirsiniz. Bireysel girişler herhangi bir sırada alınabilir. Genişlik ve yüksekliğin verilen vektör uzunluğu için pozitif ve geçerli olduğunu varsayabilirsiniz.

Vektör öğelerinin pozitif tam sayılardan daha az olduğunu varsayabilirsiniz 10.

STDIN (veya en yakın alternatif), komut satırı bağımsız değişkeni veya işlev bağımsız değişkeni ile girdi alarak ve sonucu STDOUT (veya en yakın alternatif), işlev dönüş değeri veya işlev (çıkış) parametresi aracılığıyla çıktı alarak bir program veya işlev yazabilirsiniz.

Girdi vektörü herhangi bir uygun, açık, düz liste veya dize formatında verilebilir.

Çıkış matrisi uygun, açık, iç içe liste veya dize biçiminde veya her iki matris boyutuyla birlikte düz bir liste olabilir. (Veya, elbette, dilinizde bunlar varsa bir matris türü olarak.)

Standart kuralları geçerlidir.

Test Durumları

Her test durumu formdadır 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]]

İlgili Zorluklar

Yanıtlar:


7

Jöle, 18 13 bayt

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

Satır sayısını, sütun sayısını ve düz bir listeyi ayrı komut satırı bağımsız değişkenleri olarak alır.

Kodum ikiz meydan okuma ile hemen hemen aynı . Tek fark ek (indekslerin permütasyonunu tersine çevirir) ve bir s(çıkışı bir 2D diziye bölmek).

Çevrimiçi deneyin!


4

MATL , 29 bayt

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

Giriş olup height, width, vectoryeni satır ile birbirlerinden ayrılmıştır.

Bu , ilgili soruna cevabımdaki kodun bir kısmını yeniden kullanır .

Çevrimiçi deneyin!

açıklama

:!      % 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 bayt

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

Ayrıca eğik zarf kullanan /.J gibi zigzagify gerçekleştirmek için cevap bundan meydan .

kullanım

Giriş, LHS'deki dizi ve RHS'deki boyutlarla yapılır [height, width].

   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

açıklama

]$({~[:/:@;[:<@|.`</.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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.