Alternativement, déplacer les colonnes et les lignes d'un tableau 2D

15

Objectif

Étant donné un tableau 2D de n'importe quelle taille, écrivez un programme ou une fonction pour décaler alternativement les colonnes et les lignes

Exemple

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

Tous les éléments du premier décalage de colonne vers le bas d' une rangée, le deuxième décalage de colonne jusqu'à une rangée, le troisième décalage vers le bas d' une rangée et ainsi de suite, l' emballage quand ils atteignent le bord.

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

Tous les éléments de la première rangée se déplacent vers la droite , le deuxième vers la gauche , le troisième vers la droite, etc., s'enroulant lorsqu'ils atteignent le bord.

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

Je suivrai la tradition de sélectionner le code de travail le plus court comme meilleure réponse

Karan Shishoo
la source
Le tableau peut-il avoir n'importe quelle taille, ou spécifiquement 3x5?
Jo King
je cherchais n'importe quel tableau 2D rempli. désolé de ne pas l'avoir mentionné.
Je
Pour être honnête, la mise en forme incorrecte donne à la question l'air d'une question hors sujet d'un utilisateur SO paresseux.
user202729
(BTW, n'accepte pas de réponse trop tôt)
user202729
5
@kshishoo Pour les défis futurs, vous pouvez utiliser le bac à sable pour vérifier les doublons et / ou recueillir des commentaires avant de publier sur le site principal
Rod

Réponses:

3

Husk , 7 octets

‼ozṙİ_T

Essayez-le en ligne!

Explication

‼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
la source
7

MATL , 13 octets

,!tZy:oEq2&YS

Essayez-le en ligne!

Explication

,        % 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
la source
6

J , 26, 21 19 octets

-5 octets grâce aux miles

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

Explication:

^:2 - répéter deux fois ce qui suit:

@|: - transposer et

#\ - trouver la longueur des préfixes (1, 2, 3 ... lignes)

_1^ - augmenter -1 aux puissances ci-dessus, créant une liste d'alternance -1 1 -1 1 ...

|."_1~ - faire pivoter chaque ligne du tableau d'entrée avec un décalage par rapport à la liste ci-dessus

Essayez-le en ligne!

Version originale:

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

Comment ça fonctionne

^:2 - répéter deux fois ce qui suit:

|: - transposer et

|."0 1] - faire pivoter chaque ligne du tableau d'entrée, décalages dans la liste:

@# - le nombre de lignes dans le tableau

($_1 1"0) - alterné _1 1 (3 -> _1 1 _1)

Essayez-le en ligne!

Galen Ivanov
la source
1
Vous pouvez générer les _1 1..utilisant (|."_1~_1^2|#\)@|:^:2aussi
miles
@miles Merci, c'est un bon morceau de code!
Galen Ivanov
@miles en fait je n'ai pas besoin du 2|rôle
Galen Ivanov
1
Oui, ce n'est pas le cas, c'est encore 2 octets enregistrés.
miles
2

APL + WIN, 30 octets

Invite à saisir à l'écran un tableau 2D

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

APL (Dyalog Unicode) , 26 octets

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

Essayez-le en ligne!

Préfixe Dfn.

Comment?

{(¯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é
la source
2

JavaScript (ES6), 94 91 octets

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

Il y a probablement une façon plus golfique de faire la rotation ...

Neil
la source
2

Pyth, 15 octets

L.e.>b^_1k.Tbyy

Essayez-le en ligne

Explication

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.

la source
2

q / kdb + , 32 octets

Solution:

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

Exemple:

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"

Explication:

Retournez la grille afin d'appliquer la rotation aux colonnes , la deuxième itération retourne à nouveau ainsi la rotation est appliquée aux lignes de la deuxième passe.

La rotation est basée sur la liste -1 1 -1 1.. de la longueur de la ligne / colonne en cours de rotation.

A la santé 9 octets ont été golfed hors de ce plus facile à lire la version

{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
la source
2

JavaScript (ES6),  116  76 octets

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

Essayez-le en ligne!

Commenté

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
la source
1

Nettoyer , 93 octets

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

^o^

En tant que littéral de fonction partielle, cela ressemble à un visage.

Essayez-le en ligne!

Οurous
la source
0

05AB1E , 14 octets

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

Essayez-le en ligne!

Explication

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
la source
0

APL NARS, 36 octets, 18 caractères

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

Ce {⍵⌽⍨- × - \ ⍳≢⍵} ferait pivoter chaque ligne de l'argument de matrice en suivant le vecteur -1 1 -1 1 etc (qui a sa longueur de vecteur la longueur des lignes de la matrice d'argument). Tester:

  ⎕←a←3 5⍴⎕A
ABCDE
FGHIJ
KLMNO
  ⎕←c a
OKGMI
LCNEA
JFBHD
RosLuP
la source
Continuons cette discussion dans le chat .
Erik the Outgolfer
0

bash et al, 84

Solution shell non concurrente.

Ceci est basé sur une fonction qui alterne le sens de rotation des rangées. La même procédure effectuée sur le tableau transposé fera pivoter les colonnes. Par exempletranspose | rotate | transpose | rotate .

La rotation alternée peut être effectuée sur des tableaux à caractère unique avec sedcomme ceci:

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

La transposition peut se faire avec rsou datamash:

rs -g1 -T
datamash -t' ' transpose

Pris ensemble:

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

Production:

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