В качестве альтернативы можно сместить столбцы и строки двумерного массива.


15

Задача

При наличии двумерного массива любого размера напишите программу или функцию для альтернативного смещения столбцов и строк.

пример

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

Я буду следовать традиции выбора кратчайшего рабочего кода в качестве лучшего ответа


Может ли массив быть любого размера или конкретно 3х5?
— Джо Кинг

я искал любой заполненный 2D массив. извините, что не упомянул это. Я добавлю правку
— Каран Шишу

Если честно, неправильное форматирование заставляет вопрос выглядеть так, как если бы он был не по теме от ленивого пользователя SO.
— user202729

(Кстати, не принимайте ответ слишком рано)
— user202729

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

Ответы:



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 Спасибо, это отличный кусок кода!
— Гален Иванов

@ Мили на самом деле мне не нужна 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

Pyth, 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

Баш и др., 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.