Alternatif olarak 2B dizinin sütunlarını ve satırlarını kaydırın


15

Amaç

Herhangi bir boyutta 2B dizi verildiğinde, sütunları ve satırları alternatif olarak değiştirmek için bir program veya işlev yazın

Misal

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

İlk sütundaki tüm öğeler bir satır aşağı kaydırılır , ikinci sütun bir satır yukarı kaydırılır , üçüncü sütun bir satır aşağı kaydırılır ve böylece kenara ulaştıklarında sarılır.

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

Tüm elemanlar birinci Satır kayması sağa , ikinci için sola , üçüncü için doğru bunlar kenarına ulaşmak vb ambalaj.

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

En iyi cevap olarak en kısa çalışma kodunu seçme geleneğini takip edeceğim


Dizi herhangi bir boyutta veya özellikle 3x5 olabilir mi?
— Jo King

herhangi bir dolu 2D dizi arıyordu. bahsetmediğim için üzgünüm. Ben bir düzenleme eklemek
— Karan Shishoo

Dürüst olmak gerekirse, yanlış biçimlendirme soruyu tembel bir SO kullanıcısından konu dışı bir soru gibi görünüyor.
— user202729

(BTW, çok yakında bir yanıtı kabul etmeyin)
— user202729

5
@kshishoo gelecek zorlukları için kullanabileceğiniz Sandbox çiftleri kontrol ve / veya ana sitede gönderme önce bazı geribildirim toplamak için
— Rod

Yanıtlar:


3

Kabuk , 7 bayt

‼ozṙİ_T

Çevrimiçi deneyin!

açıklama

‼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 bayt

,!tZy:oEq2&YS

Çevrimiçi deneyin!

açıklama

,        % 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 bayt

Mil sayesinde -5 bayt

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

Açıklama:

^:2 - aşağıdakileri iki kez tekrarlayın:

@|: - devrik ve

#\ - öneklerin uzunluğunu bulun (1, 2, 3 ... satır)

_1^ - -1'i -1 -1 -1 1 arasında bir liste oluşturarak yukarıdaki güçlere yükseltin ...

|."_1~ - giriş dizisinin her satırını yukarıdaki listeden çıkıntı ile döndürün

Çevrimiçi deneyin!

Orijinal versiyon:

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

Nasıl çalışır

^:2 - aşağıdakileri iki kez tekrarlayın:

|: - devrik ve

|."0 1] - giriş dizisinin her satırını, listedeki ofsetleri döndürür:

@# - dizideki satır sayısı

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

Çevrimiçi deneyin!


1
_1 1..Kullanarak (|."_1~_1^2|#\)@|:^:2da üretebilirsiniz
— mil

@miles Teşekkürler, bu harika bir kod parçası!
— Galen Ivanov

Ben ihtiyacım yok aslında @miles 2|parçasını
— Galen İvanov

1
Evet.
— mil



2

APL + WIN, 30 bayt

2d dizisinin ekran girişi için bilgi istemleri

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

2

APL (Dyalog Unicode) , 26 bayt

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

Çevrimiçi deneyin!

Önek Dfn.

Nasıl?

{(¯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 bayt

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

Rotasyonu yapmanın muhtemelen daha golfçü bir yolu var ...


2

Pyth, 15 bayt

L.e.>b^_1k.Tbyy

Çevrimiçi deneyin

açıklama

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 bayt

Çözüm:

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

Misal:

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"

Açıklama:

Sütunlara döndürme uygulamak için ızgarayı çevirin, ikinci yineleme bir kez daha çevrilir, böylece döndürme ikinci geçişteki satırlara uygulanır .

Döndürme, -1 1 -1 1..döndürülmekte olan satır / sütun uzunluğunun bir listesini temel alır .

Bu okunması kolay versiyondan sağlıklı bir 9 bayt çıkarıldı

{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 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

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

Temiz , 93 bayt

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

^o^

Kısmi işlev değişmezi olarak, bu bir yüz gibi görünür.

Çevrimiçi deneyin!


0

05AB1E , 14 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt, 18 karakter

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

Bu {⍵⌽⍨- × - \ ⍳≢⍵}, matris bağımsız değişkeninin her bir satırını -1 1 -1 1 vb. Ölçek:

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


0

bash ve ark., 84

Rakip olmayan kabuk çözümü.

Bu, satırların dönüş yönünü değiştiren bir işleve dayanır. Transpoze edilen dizide yapılan aynı prosedür sütunları döndürür. Örneğin transpose | rotate | transpose | rotate.

Alternatif döndürme, aşağıdaki sedgibi tek karakter dizilerinde yapılabilir :

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

Aktarılması ile yapılabilir rsya datamash:

rs -g1 -T
datamash -t' ' transpose

Birlikte alındıklarında:

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

Çıktı:

o k g m i
l c n e a
j f b h d
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.