Putar setiap baris dan kolom dalam sebuah matriks

15

Tantangan

Diberikan n x nmatriks bilangan bulat dengann >= 2

1 2
3 4

dan daftar bilangan bulat dengan 2nelemen yang tepat

[1,2, -3, -1]

output matriks yang diputar. Matriks ini dibuat dengan cara berikut:

  • Ambil bilangan bulat pertama dalam daftar dan putar baris pertama ke kanan dengan nilai ini.
  • Ambil bilangan bulat berikutnya dan putar kolom pertama ke bawah dengan nilai ini.
  • Ambil bilangan bulat berikutnya dan putar baris kedua ke kanan dengan nilai ini, dll. Hingga Anda memutar setiap baris dan kolom matriks satu kali.

Daftar ini dapat berisi bilangan bulat negatif yang berarti Anda menggeser baris / kolom ke kiri / atas, bukan kanan / bawah. Jika bilangan bulat adalah nol, jangan putar baris / kolom.

Contoh menggunakan input di atas

Daftar elemen Penjelasan Matriks
-------------------------------------------------- ----------
1 2 1 Putar baris ke-1 tepat dengan 1
                   3 4

2 2 1 Putar kolom 1 ke bawah sebanyak 2
                   3 4

-3 2 1 Putar baris ke-2 yang tersisa 3
                   4 3

-1 2 3 Putar kolom ke-2 sebanyak 1
                   4 1

Aturan

  • Anda dapat memilih format input yang paling mudah digunakan. Cukup jelaskan yang mana yang Anda gunakan.
  • Fungsi atau program lengkap diizinkan.
  • Aturan default untuk input / output.
  • Celah standar berlaku.
  • Ini adalah , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.

Uji kasus

Format input di sini adalah daftar daftar untuk matriks dan daftar normal untuk bilangan bulat.

[[1,2], [3,4]], [1,2, -3, -1] -> [[2,3], [4,1]]
[[1,2], [3,4]], [1,1,1,1] -> [[3,2], [4,1]]
[[1,2], [3,4]], [0,0,0,0] -> [[1,2], [3,4]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [1, -2,0, -1,3,4] -> [[7, 5,0], [- 3, -8,2], [- 4,1,6]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [3,12, -3,0, -6, -3] -> [[1 1 , 2, -3], [- 4,5,6], [7, -8,0]]

Selamat Coding!

Denker
sumber
mapcar seharusnya membantu ...
msh210

Jawaban:

6

CJam, 13 byte

{{a.m>1m<z}/}

Blok tanpa nama (fungsi) yang mengambil matriks dan daftar di atas tumpukan (dalam urutan itu) dan meninggalkan matriks baru di tempatnya.

Jalankan semua test case.

Ide yang sama, jumlah byte yang sama, implementasi yang berbeda:

{{\(@m>a+z}/}
{{(Im>a+z}fI}
{{:\Im>]z}fI}

Penjelasan

Idealnya kita ingin memperlakukan setiap instruksi dalam daftar sama, dan cukup menggunakannya untuk memutar baris pertama dari matriks. Ini dapat dilakukan dengan cukup mudah dengan mentransformasikan matriks setelah setiap instruksi sedikit dan memastikan bahwa semua transformasi tambahan tersebut dibatalkan pada akhirnya. Jadi setelah memproses setiap instruksi, kami memutar semua baris satu ke atas (sedemikian rupa sehingga instruksi berikutnya sepanjang dimensi yang sama memproses baris berikutnya) dan kemudian memindahkan matriks, sehingga kami benar-benar memproses kolom berikutnya. Transformasi tambahan ini ortogonal dengan instruksi dalam daftar dan memiliki periode yang tepat 2n, hanya apa yang kita butuhkan.

Adapun kode:

{      e# For each instruction...
  a    e#   Wrap it in a singleton array.
  .m>  e#   Combine it element-wise with the matrix to rotate right. This is
       e#   a fairly common idiom to apply a binary operation only to the first
       e#   element of an array, since element-wise operations just retain all the
       e#   unpaired elements of the longer array.
  1m<  e#   Rotate the rows one up.
  z    e#   Transpose.
}/
Martin Ender
sumber
4

APL (Dyalog Extended) , 17 15 14 13 byte

-3 byte oleh Adám

(⍉1⊖⌽`@1⍢⌽)/⌽

Cobalah online!

Mengambil input sebagai daftar di mana elemen pertama adalah matriks, dan elemen lainnya adalah jumlah rotasi. Jika ⌽ diputar ke kanan dan bukan ke kiri, ini akan mengalahkan CJam.

(⍉1⊖⌽@1 1⍢⌽)/⌽    Monadic train:
(⍉1⊖⌽@1 1⍢⌽)      Helper function to rotate and transpose once.
                        Takes args  (amount to rotate) and  (current array)
                      Function to rotate left
        1 1             2-element vector containing 1.
                        The second 1 is redundant, but saves 1 byte over (,1).
     ⌽@1 1             Function to rotate the 1st row left by ⍺.
     ⌽@1 1⍢⌽          Reverse ⍵, rotate 1st row left by ⍺, then reverse again.
                        This rotates the first row of  to the *right*.
  1                   Rotate all the rows upward,
                                                  then transpose.
(⍉1⊖⌽@1 1⍢⌽)/⌽   Fold (/) this function over the reversed input.
                     If our input is ⍵, _1, _2, ..., _2n,
                     the reversed input will be _2n, ..., _1, ⍵.
                     The / operator applies the function right to left,
                     so the  is necessary.
lirtosiast
sumber
{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)tetapi dapatkah Anda menjelaskan kepada saya mengapa @1tidak berhasil @(⍳1)atau bukan @(,1)? Selain itu, OP dapat memungkinkan Anda untuk mengambil input secara terbalik.
Adám
Jadi ternyata 'dfns' atyang berada di belakang extended @bukanlah ekstensi yang kompatibel. Namun, Anda dapat menggunakan asli @dengan `@1yang menyimpan byte di atas @1 1.
Adám
apakah rotate berfungsi secara berbeda di apl vs J? Saya mencoba menerjemahkan ini ke J dan menemukan lebih banyak kata-kata ...
Jonah
2

Python 2, 96 byte

def f(m,v):
    for i,x in enumerate(v):x%=len(m);r=m[i/2];m[i/2]=r[-x:]+r[:-x];m=zip(*m)
    return m

Tes

fmengembalikan daftar tupel. Setiap baris di badan fungsi diberi indentasi dengan 1 karakter tab.

kubah
sumber
Bukankah lurus akan return zip(*m)menghemat 5 byte?
Denker
@DenkerAffe: apakah Anda menyarankan untuk mengganti m=zip(*m);return mdengan yang baru return zip(*m)? Saya tidak bisa melakukan itu karena m=zip(*m)ini adalah bagian dari forloop
vaultah
Ya, itu adalah pikiranku. Tidak melihat bahwa itu dalam loop, salahku.
Denker