Putar setiap blok 2x2 dalam sebuah matriks

11

Tantangan

Diberi n x mmatriks dengan n > 1dan m > 1 diisi dengan bilangan bulat

1 2 3
4 5 6

dan daftar bilangan bulat dengan nilai persis sama seperti 2x2blok dalam matriks ( (n-1)*(m-1)jika Anda membutuhkan angka pastinya)

[1, 2]

Keluarkan matriks dengan setiap 2x2blok diputar oleh nilai saat ini dalam daftar dalam urutan yang diberikan. Contoh di atas akan menghasilkan

4 6 2
5 3 1

Blok pertama diputar satu kali ke kanan dan blok kedua diputar dua ke kanan.

Catatan

  • Bilangan bulat positif berarti Anda memutar dengan benar melalui banyak langkah itu.
  • Bilangan bulat negatif berarti Anda memutar ke kiri dengan banyak langkah itu.
  • Nol berarti Anda tidak memutar.
  • Anda memutar blok secara bijaksana. Itu artinya Anda mulai di baris pertama dan ke kanan. Setelah Anda memutar setiap blok di baris itu, Anda pergi ke yang berikutnya. Pada akhirnya setiap blok diputar tepat satu kali.
  • Perlu diingat bahwa blok saling tumpang tindih. Matriks pertama di atas memiliki blok [[1,2],[4,5]]dan [[2,3],[5,6]]misalnya.
  • Setiap rotasi blok mempengaruhi rotasi pada blok yang berdekatan. Inilah sebabnya mengapa Anda harus melakukan rotasi pada pola yang dijelaskan di atas.

Aturan

  • Anda dapat mengambil input dalam format yang paling nyaman. Silakan tentukan dalam jawaban Anda yang mana yang Anda gunakan. Ini tidak memungkinkan Anda untuk membaca matriks blok-bijaksana.
  • 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 nilai-nilai.

[[1,2], [3,4]], [-3] -> [[4,1], [3,2]]
[[1,1,1], [1,1,1]], [-333, 666] -> [[1,1,1], [1,1,1]]
[[1,2,3], [4,5,6]], [1,2] -> [[4,6,2], [5,3,1]]
[[1,2,3], [4,5,6], [7,8,9]], [4,0,12, -20] -> [[1,2,3], [4, 5,6], [7,8,9]]
[[1,2,3,4,5], [5,4,3,2,1], [1,2,3,4,5]], [2, -3,4,1,6, 24,21, -5] -> [[4,1,5,2,4], [2,1,3,5,5], [3,2,4,3,1]]

Selamat Coding!

Denker
sumber

Jawaban:

4

CJam ( 42 40 byte)

{(\@2$,(/.{@a@a+z(\@.{4,={+2/zW%~}*}z~}}

Demo online

Pada dasarnya ini menerapkan teknik yang sama dua kali untuk melipat blok

{4,={+2/zW%~}*}

yang beroperasi pada matriks 2x2 dan beberapa kali memutar.

[first row] [[second row] [third row] ... [last row]] [value_0 value_1 ... value_n]

dapat diproses dengan

.{block}

dan memiliki efek

[first row]
[second row] value_0 {block}~
[third row] value_1 {block}~
...

karena .(seperti %dalam CJam) tidak mengumpulkan hasilnya menjadi sebuah array sampai selesai.

Peter Taylor
sumber
Anda dapat menyimpan byte dengan menggunakan 4,=modulo yang benar (kecuali jika blok Anda perlu dijalankan setidaknya sekali?).
Martin Ender
Juga bagaimana zW%dengan rotasi?
Martin Ender
@ MartinBüttner, saya pikir rotasi tampak terlalu panjang, tapi saya tidak ingat yang lebih pendek. Trik yang bagus pada modulo.
Peter Taylor
2

CJam, 65 63 60 55 byte

Ada harus menjadi cara yang lebih baik untuk melakukan hal ini ...

{_e_\z,:N(@/Ta*ee{~4,=,f{;1$,,\[XTN_)]f+_(+er\f=}~}/N/}

Ini adalah fungsi yang tidak disebutkan namanya yang mengharapkan instruksi dan matriks (dalam urutan itu) pada stack dan meninggalkan matriks yang dihasilkan di tempatnya.

Uji di sini.

Penjelasan

Saya merasa tidak ingin menulis uraian lengkap untuk kode sekarang, jadi di sini adalah ikhtisar kasar:

  • Manipulasi array 2D adalah rasa sakit di CJam, jadi saya bukannya membuka gulungan matriks, menghitung setiap rotasi sebagai permutasi elemen pada posisi tertentu dan kemudian membagi array menjadi baris lagi di akhir. Lebar matriks disimpan di N.
  • Sebuah rotasi pada posisi kdalam array membuka gulungan perubahan empat indeks: k <- k+1, k+1 <- k+1+N, k+N <- k, k+1+N <- k+1. Untuk setiap indeks di ksepanjang daftar instruksi, saya menghitung permutasi yang sesuai dengan ini, dan menerapkannya pada larik input yang tidak dikontrol.
  • Ini meninggalkan masalah, bahwa dalam array linier beberapa rotasi akan diposisikan dengan sudut kiri atas di kolom input terakhir. Untuk melewati ini, saya riff nol nol ke dalam daftar instruksi, sehingga sub-blok 2x2 yang tidak valid ini diproses secara teknis, tetapi dengan no-op.
Martin Ender
sumber
1

Python 2 , 166 159 byte

A,R=input();m=~-len(A[0])
for j,r in enumerate(R):exec r%4*"a,b,c,d=A[j/m][j%m:][:2]+A[j/m+1][j%m:][:2];A[j/m][j%m:j%m+2]=c,a;A[j/m+1][j%m:j%m+2]=b,d;"
print A

Cobalah online!

Jonathan Frech
sumber