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


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.

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)

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!


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←⎕

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 ⍵.


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 ...


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.

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

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


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!


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

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.