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


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.

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)

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!


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

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


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


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.

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

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


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!


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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.