Alternativamente, alterne colunas e linhas de uma matriz 2D

15

Objetivo

Dada uma matriz 2D de qualquer tamanho, escreva um programa ou função para alternar alternadamente as colunas e linhas

Exemplo

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

Todos os elementos no primeiro deslocamento da coluna para baixo uma linha, a segunda troca de coluna até uma linha, o terceiro deslocamento para baixo uma fileira e assim por diante, de acondicionamento quando eles atingem a borda.

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

Todos os elementos da primeira linha são deslocados para a direita , o segundo para a esquerda , o terceiro para a direita etc., quebrando quando atingem a borda.

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

Vou seguir a tradição de selecionar o código de trabalho mais curto como a melhor resposta

Karan Shishoo
fonte
A matriz pode ter qualquer tamanho ou especificamente 3x5?
Jo rei
Eu estava procurando por qualquer array 2D preenchido. desculpe por não mencionar. Ill adicionar uma edição
Karan Shishoo
Para ser honesto, a formatação incorreta faz com que a pergunta pareça ser uma pergunta fora de tópico de um usuário de SO preguiçoso.
usar o seguinte comando
(BTW, não aceitam uma resposta muito em breve)
user202729
5
@kshishoo Para desafios futuros, você pode usar o Sandbox para verificar se há duplicatas e / ou obter algum feedback antes de postar no site principal
Rod

Respostas:

3

Casca , 7 bytes

‼ozṙİ_T

Experimente online!

Explicação

‼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
fonte
7

MATL , 13 bytes

,!tZy:oEq2&YS

Experimente online!

Explicação

,        % 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)
Luis Mendo
fonte
6

J , 26, 21 19 bytes

-5 bytes graças a milhas

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

Explicação:

^:2 - repita duas vezes o seguinte:

@|: - transpor e

#\ - encontre o comprimento dos prefixos (1, 2, 3 ... linhas)

_1^ - aumente -1 para as potências acima, criando uma lista de -1 1 -1 1 ...

|."_1~ - gire cada linha da matriz de entrada com deslocamento da lista acima

Experimente online!

Versão original:

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

Como funciona

^:2 - repita duas vezes o seguinte:

|: - transpor e

|."0 1] - gire cada linha da matriz de entrada, deslocamentos na lista:

@# - o número de linhas na matriz

($_1 1"0) - alternativo _1 1 (3 -> _1 1 _1)

Experimente online!

Galen Ivanov
fonte
1
Você pode gerar o _1 1..uso (|."_1~_1^2|#\)@|:^:2também
milhas
@ milhas Obrigado, isso é um ótimo pedaço de código!
Galen Ivanov
@miles na verdade, eu não preciso da 2|parte #
Galen Ivanov
1
Sim, na verdade você não sabe, são outros 2 bytes salvos.
miles
2

APL + WIN, 30 bytes

Solicita a entrada na tela de uma matriz 2D

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

APL (Dyalog Unicode) , 26 bytes

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

Experimente online!

Prefixo Dfn.

Quão?

{(¯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 ⍵.
J. Sallé
fonte
2

JavaScript (ES6), 94 91 bytes

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

Provavelmente existe uma maneira mais golfista de fazer a rotação ...

Neil
fonte
2

Pitão, 15 bytes

L.e.>b^_1k.Tbyy

Experimente online

Explicação

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.

fonte
2

q / kdb + , 32 bytes

Solução:

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

Exemplo:

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"

Explicação:

Vire a grade para aplicar rotação às colunas , a segunda iteração vira mais uma vez, portanto, a rotação é aplicada às linhas na segunda passagem.

A rotação é baseada na lista -1 1 -1 1..do comprimento da linha / coluna que está sendo girada.

A 9 bytes saudáveis foram extraídos desta versão mais fácil de ler

{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
rua
fonte
2

JavaScript (ES6),  116  76 bytes

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

Experimente online!

Comentado

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
fonte
1

Limpo , 93 bytes

import StdEnv,StdLib
k=[0,1:k]
^l=[[[last a:init a],tl a++[hd a]]!!b\\a<-transpose l&b<-k]

^o^

Como uma função parcial literal, isso parece um rosto.

Experimente online!

Furioso
fonte
0

05AB1E , 14 bytes

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

Experimente online!

Explicação

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
fonte
0

NARS APL, 36 bytes, 18 caracteres

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

Este {⍵⌽⍨- × - \ ⍳≢⍵} giraria cada linha do argumento da matriz seguindo o vetor -1 1 -1 1 etc (que tem seu comprimento de vetor o comprimento das linhas da matriz de argumentos). Teste:

  ⎕←a←3 5⍴⎕A
ABCDE
FGHIJ
KLMNO
  ⎕←c a
OKGMI
LCNEA
JFBHD
RosLuP
fonte
Vamos continuar esta discussão no chat .
Erik the Outgolfer
0

bash et al, 84

Solução shell não concorrente.

Isso se baseia em uma função que alterna a direção da rotação das linhas. O mesmo procedimento feito na matriz transposta girará as colunas. Por exemplotranspose | rotate | transpose | rotate .

A rotação alternada pode ser feita em matrizes de caracteres únicos com o sedseguinte:

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

A transposição pode ser feita com rsou datamash:

rs -g1 -T
datamash -t' ' transpose

Tomados em conjunto:

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

Resultado:

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