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

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

Ответы:

3

Шелуха , 7 байт

‼ozṙİ_T

Попробуйте онлайн!

объяснение

‼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.
Zgarb
источник
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
streetster
источник
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
Arnauld
источник
0

05AB1E , 14 байтов

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

Попробуйте онлайн!

объяснение

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
Emigna
источник
0

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

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

Этот {⍵⌽⍨- × - \ ⍳≢⍵} будет вращать каждую строку аргумента матрицы, следуя за вектором -1 1 -1 1 и т. Д. (Длина его вектора равна длине строк матрицы аргумента). Тестовое задание:

  ⎕←a←3 5⍴⎕A
ABCDE
FGHIJ
KLMNO
  ⎕←c a
OKGMI
LCNEA
JFBHD
RosLuP
источник
Давайте продолжим эту дискуссию в чате .
Эрик Аутгольфер
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
Тор
источник