Xoay mọi hàng và cột trong một ma trận


15

Các thách thức

Đưa ra n x n ma trận các số nguyên vớin >= 2

1 2
3 4

và một danh sách các số nguyên với chính xác 2n các phần tử

[1,2, -3, -1]

xuất ma trận xoay. Ma trận này được xây dựng theo cách sau:

  • Lấy số nguyên đầu tiên trong danh sách và xoay hàng đầu tiên sang phải theo giá trị này.
  • Lấy số nguyên tiếp theo và xoay cột đầu tiên xuống theo giá trị này.
  • Lấy số nguyên tiếp theo và xoay hàng thứ hai sang phải theo giá trị này, v.v. cho đến khi bạn xoay mỗi hàng và cột của ma trận một lần.

Danh sách có thể chứa các số nguyên âm có nghĩa là bạn dịch chuyển hàng / cột sang trái / lên thay vì phải / xuống. Nếu số nguyên bằng 0, không xoay hàng / cột.

Ví dụ sử dụng đầu vào ở trên

Danh sách phần tử ma trận Giải thích
-------------------------------------------------- ----------
1 2 1 Xoay hàng 1 bên phải bằng 1
                   3 4

2 2 1 Xoay cột thứ 1 xuống 2
                   3 4

-3 2 1 Xoay hàng thứ 2 bên trái 3
                   4 3

-1 2 3 Xoay cột thứ 2 lên 1
                   4 1

Quy tắc

  • Bạn có thể chọn định dạng đầu vào thuận tiện nhất. Chỉ cần làm rõ nó sử dụng cái nào.
  • 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 số nguyên.

[[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 , 2, -3], [- 4,5,6], [7, -8,0]]

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


mapcar sẽ giúp ích
msh210

Câu trả lời:


6

CJam, 13 byte

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

Một khối không tên (hàm) lấy ma trận và danh sách trên đầu ngăn xếp (theo thứ tự đó) và để ma trận mới ở vị trí của chúng.

Chạy tất cả các trường hợp thử nghiệm.

Cùng một ý tưởng, cùng một số byte, các cách triển khai khác nhau:

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

Giải trình

Lý tưởng nhất là chúng ta muốn xử lý từng hướng dẫn trong danh sách giống nhau và chỉ cần sử dụng nó để xoay hàng đầu tiên của ma trận. Điều này có thể được thực hiện khá dễ dàng bằng cách chuyển đổi ma trận sau mỗi lệnh một chút và đảm bảo rằng tất cả các biến đổi bổ sung đó sẽ hủy bỏ cuối cùng. Vì vậy, sau khi xử lý từng lệnh, chúng tôi xoay tất cả các hàng lên (để lệnh tiếp theo cùng chiều xử lý hàng tiếp theo) và sau đó hoán chuyển ma trận, sao cho chúng tôi thực sự xử lý các cột tiếp theo. Các phép biến đổi bổ sung này là trực giao với các hướng dẫn trong danh sách và có một khoảng thời gian chính xác 2n, đúng với những gì chúng ta cần.

Đối với mã:

{      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.
}/

4

APL (Dyalog mở rộng) , 17 15 14 13 byte

-3 byte bởi Adám

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

Hãy thử trực tuyến!

Lấy đầu vào dưới dạng danh sách trong đó phần tử đầu tiên là ma trận và các phần tử còn lại là số lượng xoay. Nếu xoay sang phải thay vì trái, điều này sẽ đánh bại 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.

{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)nhưng bạn có thể giải thích cho tôi tại sao @1sẽ không làm việc thay vì @(⍳1)hay @(,1)không? Ngoài ra, OP có thể cho phép bạn lấy đầu vào ngược lại.
Adám

Vì vậy, hóa ra dfns ' atđằng sau phần mở rộng @không phải là phần mở rộng tương thích. Tuy nhiên, bạn có thể sử dụng bản địa @với `@1giúp tiết kiệm một byte trên @1 1.
Adám

xoay làm việc khác nhau trong apl vs J? Tôi đang cố dịch nó sang J và thấy nó dài dòng hơn nhiều ...
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

Xét nghiệm

ftrả về một danh sách các bộ dữ liệu. Mỗi dòng trong thân hàm được thụt lề với 1 ký tự tab.


Sẽ không return zip(*m)giúp bạn tiết kiệm được 5 byte?
Denker

@DenkerAffe: bạn đang đề nghị thay thế m=zip(*m);return mbằng chỉ return zip(*m)? Tôi không thể làm điều đó bởi vì m=zip(*m)là một phần của forvòng lặp
vaultah

Vâng, đó là mặc dù của tôi. Không thấy rằng nó trong vòng lặp, xấu của tôi.
Denker

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.