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.