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.