Hoặc thay đổi cột và hàng của một mảng 2D


15

Mục tiêu

Đưa ra một mảng 2D có kích thước bất kỳ, viết chương trình hoặc hàm để thay thế các cột và hàng

Thí dụ

a b c d e
f g h i j
k l m n o

Tất cả các yếu tố trong cột đầu tiên chuyển xuống một hàng, cột thứ hai dịch chuyển lên một hàng, dịch chuyển thứ ba xuống một hàng và cứ thế, bao bọc khi chúng chạm tới cạnh.

k g m i o
a l c n e
f b h d j  

Tất cả các yếu tố trong hàng đầu tiên dịch chuyển sang phải , thứ hai sang trái , thứ ba sang phải , v.v., gói khi chúng đạt đến cạnh.

o k g m i
l c n e a
j f b h d

Tôi sẽ theo truyền thống chọn mã làm việc ngắn nhất là câu trả lời tốt nhất


Mảng có thể là bất kỳ kích thước, hoặc cụ thể là 3x5?
Jo King

tôi đã tìm kiếm bất kỳ mảng 2D đầy. xin lỗi vì đã không đề cập đến nó Ill thêm một chỉnh sửa
Karan Shishoo

Thành thật mà nói, định dạng không phù hợp làm cho câu hỏi trông giống như đó là một câu hỏi ngoài chủ đề từ một người dùng SO lười biếng.
dùng202729

(BTW, không chấp nhận câu trả lời quá sớm)
user202729

5
@kshishoo Đối với những thách thức trong tương lai, bạn có thể sử dụng Hộp cát để kiểm tra các bản sao và / hoặc thu thập một số phản hồi trước khi đăng lên trang web chính
Rod

Câu trả lời:


3

Husk , 7 byte

‼ozṙİ_T

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

Giải trình

‼ozṙİ_T  Implicit input: a list of lists.
‼        Do this twice:
      T   Transpose,
 oz       then zip with
    İ_    the infinite list [-1,1,-1,1,-1,1,..
   ṙ      using rotation. This rotates the rows in alternating directions.

7

MATL , 13 byte

,!tZy:oEq2&YS

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

Giải trình

,        % Do twice
  !      %   Transpose. Takes input implicitly the first time
  t      %   Duplicate
  Zy     %   Size. Gives a vector with numbers of rows and of columns
  :      %   Range from 1 to the first entry of the vector (number of rows)
  o      %   Parity: gives 0 or 1 for eacn entry
  Eq     %   Times 2, minus 1: transforms 0 into -1
  2      %   Push 2
  &YS    %   Circularly shift along the second dimension. This shifts the
         %   first row by 1 (that is, to the right), the second by -1 (to
         %   the left), etc.
         % End (implicit). Display (implicit)

6

J , 26, 21 19 byte

-5 byte nhờ dặm

(|."_1~_1^#\)@|:^:2

Giải trình:

^:2 - lặp lại hai lần như sau:

@|: - hoán vị và

#\ - tìm độ dài của các tiền tố (1, 2, 3 ... hàng)

_1^ - nâng -1 lên các quyền hạn trên, tạo danh sách xen kẽ -1 1 -1 1 ...

|."_1~ - xoay từng hàng của mảng đầu vào có offset từ danh sách trên

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

Phiên bản gốc:

(($_1 1"0)@#|."0 1])@|:^:2

Làm thế nào nó hoạt động

^:2 - lặp lại hai lần như sau:

|: - hoán vị và

|."0 1] - xoay từng hàng của mảng đầu vào, offset trong danh sách:

@# - số lượng hàng trong mảng

($_1 1"0) - thay thế _1 1 (3 -> _1 1 _1)

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


1
Bạn có thể tạo ra _1 1..sử dụng (|."_1~_1^2|#\)@|:^:2cũng
dặm

@miles Cảm ơn, đó là một đoạn mã tuyệt vời!
Galen Ivanov

@miles trên thực tế tôi không cần 2|phần
Galen Ivanov

1
Có, bạn thực sự không, đó là 2 byte khác được lưu.
dặm



2

APL + THẮNG, 30 byte

Lời nhắc cho đầu vào màn hình của mảng 2d

((↑⍴m)⍴¯1 1)⌽((1↓⍴m)⍴¯1 1)⊖m←⎕

2

APL (Dyalog Unicode) , 26 byte

{(¯1 1⍴⍨≢⍵)⌽(¯1 1⍴⍨≢⍉⍵)⊖⍵}

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

Tiền tố Dfn.

Làm sao?

{(¯1 1⍴⍨≢⍵)⌽(¯1 1⍴⍨≢⍉⍵)⊖⍵}⍝ Main function, prefix. Input matrix is ⍵.
                        ⊖⍵}⍝ Rotate the columns of  according to the left arg:
            (       ⍉⍵)     Transpose  (makes a 3x5 matrix become 5x3)
                           Tally (yields the number of rows of the matrix)
                           Swap arguments of the following fn/op
                           Shape
             ¯1 1           This vector. This yields a vector of ¯1 1 with size = number of columns of ⍵.
                           Rotate the rows of  according to the left arg:
{(¯1 1⍴⍨≢⍵)                 Does the same as the preceding expression, without transposing ⍵.


2

JavaScript (ES6), 94 91 byte

a=>(g=a=>a[0].map((_,i)=>(b=a.map(a=>a[i]),i%2?[...b.slice(1),b[0]]:[b.pop(),...b])))(g(a))

Có lẽ có một cách chơi gôn để thực hiện vòng quay ...


2

Bình thường, 15 byte

L.e.>b^_1k.Tbyy

Dùng thử trực tuyến

Giải trình

L.e.>b^_1k.Tbyy
L           b      Define a function on a list...
          .T       ... which transposes it...
 .e.>b^_1k         ... and rotates each row alternating left and right.
             yyQ   Apply twice to the (implicit) input array.

2

q / kdb + , 32 byte

Giải pháp:

{rotate'[#:[x+:]#-1 1](+)x}/[2;]

Thí dụ:

q)3 5#.Q.a / reshape "a..o" into 3 row, 5 column grid
"abcde"
"fghij"
"klmno"
q){rotate'[#:[(+)x]#-1 1](+)x}/[2;]3 5#.Q.a
"okgmi"
"lcnea"
"jfbhd"

Giải trình:

Lật lưới để áp dụng xoay cho các cột , lần lặp thứ hai lại lật một lần nữa, do đó xoay được áp dụng cho các hàng trên đường chuyền thứ hai.

Xoay vòng dựa trên danh sách -1 1 -1 1..độ dài của hàng / cột được xoay.

Một 9 byte khỏe mạnh đã được đánh dấu từ phiên bản dễ đọc hơn này

{rotate'[count[flip x]#-1 1;flip x]}/[2;] / ungolfed solution
{                                  }/[2;] / perform lambda 2 times
 rotate'[                  ;      ]       / perform rotate on each-both
                            flip x        / flip x<->y of grid
                      #-1 1               / take from list -1 1
         count[flip x]                    / the length of the flipped grid

2

JavaScript (ES6),  116  76 byte

m=>(g=m=>m[0].map((_,x)=>m.map(_=>m[y++%h][x],h=m.length,y=x&1||h-1)))(g(m))

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

Đã bình luận

m => (                 // m[] = input matrix
  g = m =>             // g is the main helper function taking a matrix m[]
    m[0].map((_, x) => // for each column at position x in m[]:
      m.map(_ =>       //   for each row of m[]:
        m[y++ % h][x], //     yield the x-th value of the row (y mod h) and increment y
        h = m.length,  //     h = number of rows
        y = x & 1      //     start with y = 1 if x is odd,
            || h - 1   //     or h - 1 if x is even
      )                //   end of inner map()
  )                    // end of outer map()
)(g(m))                // invoke g twice on the input matrix


1

Sạch , 93 byte

import StdEnv,StdLib
k=[0,1:k]
^l=[[[last a:init a],tl a++[hd a]]!!b\\a<-transpose l&b<-k]

^o^

Là một chức năng một phần theo nghĩa đen, điều đó xảy ra trông giống như một khuôn mặt.

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



0

APL NARS, 36 byte, 18 ký tự

c←b∘b←{⍵⌽⍨-×-\⍳≢⍵}∘⍉

{⍵⌽⍨- × - \ ⍳≢⍵} này sẽ xoay từng hàng của đối số ma trận theo vectơ -1 1 -1 1 v.v (có độ dài vectơ của nó theo chiều dài của các hàng ma trận đối số). Kiểm tra:

  ⎕←a←3 5⍴⎕A
ABCDE
FGHIJ
KLMNO
  ⎕←c a
OKGMI
LCNEA
JFBHD


0

bash et al, 84

Giải pháp vỏ không cạnh tranh.

Điều này dựa trên một hàm xen kẽ hướng quay của các hàng. Quy trình tương tự được thực hiện trên mảng chuyển đổi sẽ xoay các cột. Ví dụtranspose | rotate | transpose | rotate .

Việc luân phiên có thể được thực hiện trên các mảng ký tự đơn sednhư sau:

sed -E 's/(.*) (.)$/\2 \1/; n; s/^(.) (.*)/\2 \1/'

Việc hoán vị có thể được thực hiện với rshoặc datamash:

rs -g1 -T
datamash -t' ' transpose

Lấy nhau:

r() { sed -E 's/(.*) (.)$/\2 \1/; n; s/^(.) (.*)/\2 \1/'; }
t() { rs -g1 -T; }
<f t | r | t | r

Đầu ra:

o k g m i
l c n e a
j f b h d
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.