Alternatywnie przesuwaj kolumny i rzędy tablicy 2D

15

Cel

Biorąc pod uwagę tablicę 2D o dowolnym rozmiarze, napisz program lub funkcję, aby przesunąć na przemian kolumny i wiersze

Przykład

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

Wszystkie elementy w pierwszej kolumnie przesuwają się o jeden wiersz w dół , w drugiej kolumnie przesuwają się o jeden wiersz, trzecie przesuwają się w dół o jeden wiersz itd., Owijając się, gdy osiągną krawędź.

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

Wszystkie elementy w pierwszym rzędzie przesuwają się w prawo , drugi w lewo , trzeci w prawo itp., Owijają się, gdy osiągną krawędź.

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

Będę podążał za tradycją wyboru najkrótszego działającego kodu jako najlepszej odpowiedzi

Karan Shishoo
źródło
Czy tablica może mieć dowolny rozmiar, a konkretnie 3x5?
Jo King
szukałem wypełnionego zestawu 2D. przepraszam, że o tym nie wspomniałem. Dodam zmianę
Karan Shishoo,
Szczerze mówiąc, niewłaściwe formatowanie sprawia, że ​​pytanie wygląda na pytanie nie na temat od leniwego użytkownika SO.
user202729,
(BTW, nie przyjmuj odpowiedzi zbyt wcześnie)
user202729
5
@kshishoo W przypadku przyszłych wyzwań możesz użyć piaskownicy, aby sprawdzić duplikaty i / lub zebrać opinie przed opublikowaniem na głównej stronie
Rod

Odpowiedzi:

3

Łuska , 7 bajtów

‼ozṙİ_T

Wypróbuj online!

Wyjaśnienie

‼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
źródło
7

MATL , 13 bajtów

,!tZy:oEq2&YS

Wypróbuj online!

Wyjaśnienie

,        % 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
źródło
6

J , 26, 21 19 bajtów

-5 bajtów dzięki milom

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

Wyjaśnienie:

^:2 - powtórzyć dwukrotnie:

@|: - transponować i

#\ - znajdź długość prefiksów (1, 2, 3 ... rzędy)

_1^ - podnieś -1 do powyższych mocy, tworząc listę naprzemiennych -1 1 -1 1 ...

|."_1~ - obróć każdy wiersz tablicy wejściowej z przesunięciem w stosunku do powyższej listy

Wypróbuj online!

Orginalna wersja:

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

Jak to działa

^:2 - powtórzyć dwukrotnie:

|: - transponować i

|."0 1] - obróć każdy wiersz tablicy wejściowej, przesunięcia na liście:

@# - liczba rzędów w tablicy

($_1 1"0) - na przemian _1 1 (3 -> _1 1 _1)

Wypróbuj online!

Galen Iwanow
źródło
1
Można wygenerować _1 1..przy użyciu (|."_1~_1^2|#\)@|:^:2także
Miles
@miles Dzięki, to świetny kawałek kodu!
Galen Iwanow
@miles w rzeczywistości nie potrzebuję 2|części
Galen Iwanow
1
Tak, faktycznie nie, to kolejne 2 bajty zapisane.
mile
2

APL + WIN, 30 bajtów

Monity o wprowadzenie ekranu tablicy 2d

((↑⍴m)⍴¯1 1)⌽((1↓⍴m)⍴¯1 1)⊖m←⎕
Graham
źródło
2

APL (Dyalog Unicode) , 26 bajtów

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

Wypróbuj online!

Prefiks Dfn.

W jaki sposób?

{(¯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é
źródło
2

JavaScript (ES6), 94 91 bajtów

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

Prawdopodobnie istnieje sposób golfisty, aby wykonać rotację ...

Neil
źródło
2

Pyth, 15 bajtów

L.e.>b^_1k.Tbyy

Wypróbuj online

Wyjaśnienie

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.

źródło
2

q / kdb + , 32 bajty

Rozwiązanie:

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

Przykład:

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"

Wyjaśnienie:

Odwróć siatkę, aby zastosować obrót do kolumn , druga iteracja ponownie się odwróci, a zatem obrót zostanie zastosowany do wierszy w drugim przejściu.

Obrót opiera się na liście -1 1 -1 1..długości obracanego wiersza / kolumny.

Od tej łatwiejszej do odczytania wersji oderwano zdrowe 9 bajtów

{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
źródło
2

JavaScript (ES6),  116  76 bajtów

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

Wypróbuj online!

Skomentował

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
źródło
1

Czysty , 93 bajty

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

^o^

Jako dosłownie funkcja częściowa, wygląda to jak twarz.

Wypróbuj online!

Obrzydliwe
źródło
0

05AB1E , 14 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
źródło
0

APL NARS, 36 bajtów, 18 znaków

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

Ten {⍵⌽⍨- × - \ ⍳≢⍵} obracałby każdy wiersz argumentu macierzy zgodnie z wektorem -1 1 -1 1 itd. (Który ma długość wektora długości wierszy macierzy argumentów). Test:

  ⎕←a←3 5⍴⎕A
ABCDE
FGHIJ
KLMNO
  ⎕←c a
OKGMI
LCNEA
JFBHD
RosLuP
źródło
Daj nam kontynuować tę dyskusję w czacie .
Erik the Outgolfer
0

bash i in., 84

Niekonkurencyjne rozwiązanie powłoki.

Jest to oparte na funkcji, która zmienia kierunek obrotu rzędów. Ta sama procedura wykonana w transponowanym macierzy spowoduje obrócenie kolumn. Na przykład transpose | rotate | transpose | rotate.

Obrót naprzemienny można wykonać na tablicach jednoznakowych w sednastępujący sposób:

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

Transpozycji można dokonać za pomocą rslub datamash:

rs -g1 -T
datamash -t' ' transpose

Razem wzięte:

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

Wynik:

o k g m i
l c n e a
j f b h d
Thor
źródło