Cara lainnya menggeser kolom dan baris array 2D

15

Objektif

Dengan array 2D ukuran berapa pun, tulislah sebuah program atau fungsi untuk menggeser kolom dan baris secara alternatif

Contoh

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

Semua elemen di kolom pertama bergeser ke bawah satu baris, kolom kedua bergeser ke atas satu baris, yang ketiga bergeser ke bawah satu baris dan seterusnya, membungkus ketika mereka mencapai tepi.

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

Semua elemen di baris pertama bergeser ke kanan , yang kedua ke kiri , yang ketiga ke kanan dll, membungkus ketika mereka mencapai tepi.

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

Saya akan mengikuti tradisi memilih kode kerja terpendek sebagai jawaban terbaik

Karan Shishoo
sumber
Bisakah array ukuran apa pun, atau secara khusus 3x5?
Jo King
saya sedang mencari array 2D yang diisi. maaf karena tidak menyebutkannya. Saya akan menambahkan suntingan
Karan Shishoo
Sejujurnya, format yang tidak tepat membuat pertanyaan tampak seolah-olah itu adalah pertanyaan di luar topik dari pengguna SO yang malas.
user202729
(BTW, jangan terlalu cepat menerima jawaban)
user202729
5
@kshishoo Untuk tantangan di masa mendatang Anda dapat menggunakan Sandbox untuk memeriksa duplikat dan / atau mengumpulkan umpan balik sebelum memposting di situs utama
Rod

Jawaban:

3

Sekam , 7 byte

‼ozṙİ_T

Cobalah online!

Penjelasan

‼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.
Zgarb
sumber
7

MATL , 13 byte

,!tZy:oEq2&YS

Cobalah online!

Penjelasan

,        % 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)
Luis Mendo
sumber
6

J , 26, 21 19 byte

-5 byte berkat mil

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

Penjelasan:

^:2 - ulangi dua kali berikut ini:

@|: - transpose dan

#\ - cari panjang awalan (1, 2, 3 ... baris)

_1^ - naikkan -1 ke kekuatan di atas, buat daftar bolak-balik -1 1 -1 1 ...

|."_1~ - putar setiap baris array input dengan offset dari daftar di atas

Cobalah online!

Versi asli:

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

Bagaimana itu bekerja

^:2 - ulangi dua kali berikut ini:

|: - transpose dan

|."0 1] - Putar setiap baris array input, offset dalam daftar:

@# - jumlah baris dalam array

($_1 1"0) - alternatif _1 1 (3 -> _1 1 _1)

Cobalah online!

Galen Ivanov
sumber
1
Anda dapat _1 1..menggunakan (|."_1~_1^2|#\)@|:^:2juga
mil
@miles Terima kasih, itu kode yang luar biasa!
Galen Ivanov
@miles sebenarnya saya tidak butuh 2|bagian
Galen Ivanov
1
Ya, Anda sebenarnya tidak, itu 2 byte lagi disimpan.
mil
2

APL + MENANG, 30 byte

Meminta input layar dari array 2d

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

APL (Dyalog Unicode) , 26 byte

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

Cobalah online!

Awalan Dfn.

Bagaimana?

{(¯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 ⍵.
J. Sallé
sumber
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))

Mungkin ada cara golf untuk melakukan rotasi ...

Neil
sumber
2

Pyth, 15 byte

L.e.>b^_1k.Tbyy

Cobalah online

Penjelasan

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.

sumber
2

q / kdb + , 32 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Balikkan kisi untuk menerapkan rotasi ke kolom , iterasi kedua membalik sekali lagi sehingga rotasi diterapkan ke baris pada lintasan kedua.

Rotasi didasarkan pada daftar -1 1 -1 1.. panjang baris / kolom yang diputar.

9 byte yang sehat telah di-golf dari versi yang lebih mudah dibaca ini

{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
streetster
sumber
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))

Cobalah online!

Berkomentar

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
Arnauld
sumber
1

Bersihkan , 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^

Sebagai fungsi parsial literal, yang terjadi terlihat seperti wajah.

Cobalah online!

Suram
sumber
0

05AB1E , 14 byte

2FøvyNÉiÀëÁ}})

Cobalah online!

Penjelasan

2F               # 2 times do:
  ø              # zip
   vy            # for each row(y), index(N) do:
     NÉiÀ        # if N is odd, rotate left
         ëÁ      # else rotate right
           }}    # end if and inner loop
             )   # wrap in list
Emigna
sumber
0

APL NARS, 36 byte, 18 karakter

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

{⍵⌽⍨- × - \ ⍳≢⍵} ini akan memutar setiap baris argumen matriks mengikuti vektor -1 1 -1 1 dll (yang memiliki panjang vektor panjang panjang baris argumen matriks). Uji:

  ⎕←a←3 5⍴⎕A
ABCDE
FGHIJ
KLMNO
  ⎕←c a
OKGMI
LCNEA
JFBHD
RosLuP
sumber
Mari kita lanjutkan diskusi ini dalam obrolan .
Erik the Outgolfer
0

bash et al, 84

Solusi shell yang tidak bersaing.

Ini didasarkan pada fungsi yang bergantian arah rotasi baris. Prosedur yang sama dilakukan pada array yang dialihkan akan memutar kolom. Sebagai contoh transpose | rotate | transpose | rotate.

Rotasi bolak-balik dapat dilakukan pada array karakter tunggal dengan sedseperti ini:

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

Transposisi dapat dilakukan dengan rsatau datamash:

rs -g1 -T
datamash -t' ' transpose

Diambil bersama-sama:

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

Keluaran:

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