Xoay mỗi khối 2x2 trong ma trận


11

Các thách thức

Đưa ra một n x mma trận có n > 1m > 1 chứa đầy các số nguyên

1 2 3
4 5 6

và một danh sách các số nguyên có nhiều giá trị như 2x2các khối trong ma trận ( (n-1)*(m-1)nếu bạn cần số chính xác)

[1, 2]

Xuất ma trận với mỗi 2x2khối được xoay theo giá trị hiện tại trong danh sách theo thứ tự đã cho. Ví dụ trên sẽ mang lại

4 6 2
5 3 1

Khối thứ nhất được xoay một lần sang phải và khối thứ hai được xoay hai sang phải.

Ghi chú

  • Một số nguyên dương có nghĩa là bạn xoay phải theo nhiều bước.
  • Một số nguyên âm có nghĩa là bạn xoay trái theo nhiều bước.
  • Số không có nghĩa là bạn không xoay.
  • Bạn xoay các khối hàng khôn ngoan. Điều đó có nghĩa là bạn bắt đầu ở hàng đầu tiên và đi bên phải. Khi bạn xoay mọi khối trong hàng đó, bạn chuyển sang khối tiếp theo. Cuối cùng, mỗi khối được quay chính xác một lần.
  • Hãy nhớ rằng các khối chồng lên nhau. Ma trận đầu tiên ở trên có các khối [[1,2],[4,5]][[2,3],[5,6]]ví dụ.
  • Mỗi vòng quay của một khối ảnh hưởng đến vòng quay trên các khối liền kề. Đây là lý do tại sao bạn phải thực hiện các phép quay trong mô hình được mô tả ở trên.

Quy tắc

  • Bạn có thể lấy đầu vào ở định dạng thuận tiện nhất. Vui lòng ghi rõ trong câu trả lời của bạn mà bạn sử dụng. Điều này không cho phép bạn đọc khối ma trận mặc dù.
  • Chức năng hoặc chương trình đầy đủ cho phép.
  • Quy tắc mặc định cho đầu vào / đầu ra.
  • Tiêu chuẩn áp dụng.
  • Đây là , do đó, số byte thấp nhất sẽ thắng. Tiebreaker là trình trước đó.

Các trường hợp thử nghiệm

Định dạng đầu vào ở đây là danh sách các danh sách cho ma trận và danh sách bình thường cho các giá trị.

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

Chúc mừng mã hóa!

Câu trả lời:


4

CJam ( 42 40 byte)

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

Bản demo trực tuyến

Về cơ bản, điều này áp dụng kỹ thuật tương tự hai lần để gấp khối

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

hoạt động trên ma trận 2x2 và số lần xoay.

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

có thể được xử lý với

.{block}

và có tác dụng

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

bởi vì .(như %trong CJam) không thu thập kết quả thành một mảng cho đến khi hoàn thành.


Bạn có thể lưu một byte bằng cách sử dụng 4,=cho modulo chính xác (trừ khi khối của bạn cần chạy ít nhất một lần?).
Martin Ender

Còn những gì về zW%vòng quay?
Martin Ender

@ MartinBüttner, tôi nghĩ vòng quay có vẻ quá dài, nhưng tôi không thể nhớ vòng quay ngắn hơn. Thủ thuật hay trên modulo.
Peter Taylor

2

CJam, 65 63 60 55 byte

phải là một cách tốt hơn để làm điều này ...

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

Đây là một hàm không tên, dự kiến ​​các hướng dẫn và ma trận (theo thứ tự đó) trên ngăn xếp và để lại ma trận kết quả ở vị trí của chúng.

Kiểm tra nó ở đây.

Giải trình

Tôi không cảm thấy như viết toàn bộ phân tích mã ngay bây giờ, vì vậy đây là một tổng quan sơ bộ:

  • Thao tác mảng 2D là một vấn đề khó khăn đối với CJam, vì vậy thay vào đó tôi không điều khiển ma trận, tính toán mỗi vòng quay dưới dạng hoán vị của các phần tử tại các vị trí cụ thể và sau đó chia mảng thành các hàng một lần nữa ở cuối. Chiều rộng của ma trận được lưu trữ trong N.
  • Một vòng xoay ở vị trí ktrong mảng unrolled thay đổi Bốn chỉ số: k <- k+1, k+1 <- k+1+N, k+N <- k, k+1+N <- k+1. Đối với mỗi chỉ mục kdọc theo danh sách hướng dẫn, tôi tính toán một hoán vị tương ứng với điều này và áp dụng nó cho mảng đầu vào không được kiểm soát.
  • Điều này để lại vấn đề, rằng trong mảng tuyến tính, một số phép quay sẽ được định vị với góc trên cùng bên trái của nó trong cột cuối cùng của đầu vào. Để bỏ qua những điều này, tôi riffle các số 0 vào danh sách hướng dẫn, sao cho các khối con 2x2 không hợp lệ này được xử lý kỹ thuật, nhưng không có op.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.