Альтернативно зміщуйте стовпці та рядки двовимірного масиву


15

Об'єктивна

Давши 2D-масив будь-якого розміру, напишіть програму або функцію для зміщення стовпців і рядків

Приклад

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

Усі елементи в першому стовпчику зміщуються вниз на один рядок, у другому стовпчику зміщуються вгору на один ряд, у третьому зміщуються вниз по одному рядку і так далі, загортаючись, коли вони доходять до краю.

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

Всі елементи в першому зрушенні рядки до правому , то другий , щоб до лівого , тим третього до правим і т.д., упаковок , коли вони досягають краю.

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

Я буду дотримуватися традиції вибору найкоротшого робочого коду як найкращої відповіді


Чи може масив бути будь-якого розміру, а саме 3x5?
Jo King

я шукав будь-який заповнений 2D масив. вибачте, що не згадуєте про це. Я додаю правки
Karan Shishoo

Якщо чесно, неправильне форматування змушує запитання виглядати так, як якщо б це було поза темою від ледачого користувача SO.
користувач202729

(BTW, не приймайте відповідь занадто рано)
користувач202729

5
@kshishoo Для майбутніх викликів ви можете скористатися пісочницею, щоб перевірити наявність дублікатів та / або зібрати деякий зворотній зв'язок перед публікацією на головному сайті
стрижень

Відповіді:



7

MATL , 13 байт

,!tZy:oEq2&YS

Спробуйте в Інтернеті!

Пояснення

,        % 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 байт

-5 байт завдяки милям

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

Пояснення:

^:2 - повторити двічі наступне:

@|: - перенести і

#\ - знайдіть довжину від префіксів (1, 2, 3 ... рядки)

_1^ - підняти -1 до вищезазначених повноважень, створивши список чергування -1 1 -1 1 ...

|."_1~ - обертати кожен рядок вхідного масиву зі зміщенням від наведеного вище списку

Спробуйте в Інтернеті!

Оригінальна версія:

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

Як це працює

^:2 - повторити двічі наступне:

|: - перенести і

|."0 1] - обертати кожен рядок вхідного масиву, зміщуючи у списку:

@# - кількість рядків у масиві

($_1 1"0) - чергувати _1 1 (3 -> _1 1 _1)

Спробуйте в Інтернеті!


1
Його можна створити , _1 1..використовуючи (|."_1~_1^2|#\)@|:^:2також
Майлзу

@miles Дякую, це чудовий фрагмент коду!
Гален Іванов

@miles насправді мені не потрібна 2|роль
Гален Іванов,

1
Так, ви насправді ні, це ще 2 байти збережено.
миль



2

APL + WIN, 30 байт

Підказки для введення екрану 2d масиву

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

2

APL (Dyalog Unicode) , 26 байт

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

Спробуйте в Інтернеті!

Префікс Dfn.

Як?

{(¯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 байт

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

Напевно, існує гольфістський спосіб зробити обертання ...


2

Піт, 15 байт

L.e.>b^_1k.Tbyy

Спробуйте в Інтернеті

Пояснення

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 байти

Рішення:

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

Приклад:

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"

Пояснення:

Переверніть сітку, щоб застосувати обертання до стовпців , друга ітерація знову перевертається, таким чином обертання застосовується до рядків на другому проході.

Обертання базується на списку -1 1 -1 1..довжини рядка / стовпця, що обертається.

Здорові 9 байт були golfed від від цього легше для читання версії

{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 байт

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

Спробуйте в Інтернеті!

Прокоментував

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




0

APL NARS, 36 байт, 18 символів

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

Цей {⍵⌽⍨- × - \ ⍳≢⍵} повертає кожен рядок аргументу матриці за вектором -1 1 -1 1 тощо (який має свою довжину вектора - довжину рядків матриці аргументу). Тест:

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


0

bash та ін, 84

Неконкурентне рішення оболонки.

Це ґрунтується навколо функції, яка чергує напрямок обертання рядків. Ця ж процедура, що виконується для перекладеного масиву, буде обертати стовпці. Наприкладtranspose | rotate | transpose | rotate .

Чергування обертання може бути виконано на масивах з одним символом sedтаким чином:

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

Перестановка може бути зроблено з rsабо datamash:

rs -g1 -T
datamash -t' ' transpose

У сукупності:

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

Вихід:

o k g m i
l c n e a
j f b h d
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.