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


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.

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)

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!


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←⎕

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 ⍵.


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


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.

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

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


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!


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

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.