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


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.