Alternativ können Sie Spalten und Zeilen eines 2D-Arrays verschieben


15

Zielsetzung

Schreiben Sie bei einem 2D-Array beliebiger Größe ein Programm oder eine Funktion, um alternativ die Spalten und Zeilen zu verschieben

Beispiel

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

Alle Elemente in der ersten Spalte Verschiebung nach unten eine Zeile, die zweite Spalte Verschiebung bis eine Zeile, die dritte Verschiebung nach unten eine Zeile und so weiter, die Umhüllung , wenn sie erreichen den Rand.

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

Alle Elemente in der ersten Reihe verschieben sich nach rechts , die zweite nach links , die dritte nach rechts usw. und werden umbrochen, wenn sie die Kante erreichen.

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

Ich werde der Tradition folgen, den kürzesten Arbeitscode als beste Antwort zu wählen


Kann das Array eine beliebige Größe haben oder speziell 3x5?
— Jo King

Ich war auf der Suche nach einem gefüllten 2D-Array. Es tut mir leid, dass ich es nicht erwähne.
— Ich werde

Um ehrlich zu sein, sieht die Frage durch die falsche Formatierung so aus, als wäre sie eine Off-Topic-Frage eines faulen SO-Benutzers.
— user202729

(Übrigens, akzeptieren Sie keine Antwort zu früh)
— user202729

5
@kshishoo Für zukünftige Herausforderungen können Sie die Sandbox verwenden , um nach Duplikaten zu suchen und / oder Feedback einzuholen, bevor Sie auf der Hauptseite veröffentlichen
— Rod

Antworten:


3

Schale , 7 Bytes

‼ozṙİ_T

Probieren Sie es online!

Erläuterung

‼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

Probieren Sie es online!

Erläuterung

,        % 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 dank Meilen

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

Erläuterung:

^:2 - zweimal wiederholen:

@|: - transponieren und

#\ - finde die Länge der Präfixe (1, 2, 3 ... Zeilen)

_1^ - Erhöhe -1 auf die obigen Potenzen und erstelle eine Liste mit abwechselnden -1 1 -1 1 ...

|."_1~ - Drehen Sie jede Zeile des Eingabearrays mit einem Versatz von der obigen Liste

Probieren Sie es online!

Originalfassung:

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

Wie es funktioniert

^:2 - zweimal wiederholen:

|: - transponieren und

|."0 1] - Drehen Sie jede Zeile des Eingabearrays, Offsets in der Liste:

@# - Die Anzahl der Zeilen im Array

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

Probieren Sie es online!


1
Sie können die _1 1..mit (|."_1~_1^2|#\)@|:^:2auch
— Meilen

@miles Danke, das ist ein großartiger Code!
— Galen Ivanov

@ Meilen in der Tat brauche ich das 2|Teil nicht
— Galen Ivanov

1
Ja, das tust du eigentlich nicht, das sind weitere 2 Bytes, die gespeichert wurden.
— Meilen



2

APL + WIN, 30 Bytes

Fordert zur Eingabe eines Bildschirms für ein 2D-Array auf

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

2

APL (Dyalog Unicode) , 26 Byte

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

Probieren Sie es online!

Präfix Dfn.

Wie?

{(¯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 Byte

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

Es gibt wahrscheinlich eine golferischere Möglichkeit, die Rotation durchzuführen ...


2

Pyth, 15 Bytes

L.e.>b^_1k.Tbyy

Probieren Sie es online aus

Erläuterung

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

Lösung:

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

Beispiel:

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"

Erläuterung:

Drehen Sie das Raster, um die Drehung auf die Spalten anzuwenden . Die zweite Iteration wird erneut umgekehrt, sodass die Drehung beim zweiten Durchgang auf die Zeilen angewendet wird .

Die Drehung basiert auf der Liste -1 1 -1 1..der Länge der gedrehten Zeile / Spalte.

Von dieser leichter zu lesenden Version wurden gesunde 9 Bytes abgespielt

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

Probieren Sie es online!

Kommentiert

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



0

05AB1E , 14 Bytes

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

Probieren Sie es online!

Erläuterung

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 Byte, 18 Zeichen

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

Dieses {⍵⌽⍨- × - \ ⍳≢⍵} würde jede Zeile des Matrixarguments nach dem Vektor -1 1 -1 1 usw. drehen (dessen Vektorlänge der Länge der Argumentmatrixzeilen entspricht). Prüfung:

  ⎕←a←3 5⍴⎕A
ABCDE
FGHIJ
KLMNO
  ⎕←c a
OKGMI
LCNEA
JFBHD


0

Bash et al., 84

Nicht konkurrierende Shell-Lösung.

Dies basiert auf einer Funktion, die die Drehrichtung der Zeilen wechselt. Das gleiche Verfahren, das für das transponierte Array durchgeführt wird, dreht die Spalten. Zum Beispiel transpose | rotate | transpose | rotate.

Die abwechselnde Rotation kann für einzelne Zeichen-Arrays folgendermaßen durchgeführt werden sed:

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

Die Umsetzung kann erfolgen mit rsoder datamash:

rs -g1 -T
datamash -t' ' transpose

Zusammen genommen:

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

Ausgabe:

o k g m i
l c n e a
j f b h d
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.