또는 2D 배열의 열과 행을 이동


15

객관적인

어떤 크기의 2D 배열이 주어지면, 열과 행을 교대로 이동시키는 프로그램이나 함수를 작성하십시오

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

첫 번째 열의 모든 요소는 한 행 아래로 이동 하고 두 번째 열은 한 행 위로 이동 하고 번째 열은 한 행 아래로 이동 하는 등 가장자리에 도달하면 줄 바꿈됩니다.

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

첫 번째 행의 모든 요소 는 오른쪽으로 , 두 번째왼쪽으로 , 세 번째오른쪽으로 이동하여 가장자리에 도달하면 줄 바꿈됩니다.

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

가장 짧은 작업 코드를 최상의 답변으로 선택하는 전통을 따릅니다.


배열의 크기 또는 구체적으로 3x5 일 수 있습니까?
Jo King

채워진 2D 배열을 찾고있었습니다. 언급하지 않아서 죄송합니다. 편집 추가
Karan Shishoo

솔직히 말해서, 부적절한 형식은 질문이 게으른 SO 사용자의 주제가 아닌 질문처럼 보이게 만듭니다.
user202729

(BTW, 너무 빨리 답변을 수락하지 마십시오)
user202729

5
@kshishoo 미래의 도전을 위해 샌드 박스 를 사용하여 중복 여부를 확인하거나 피드백을 수집 할 수 있습니다
Rod

답변:


3

껍질 , 7 바이트

‼ozṙİ_T

온라인으로 사용해보십시오!

설명

‼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 바이트

,!tZy:oEq2&YS

온라인으로 사용해보십시오!

설명

,        % 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 바이트

마일로 인해 -5 바이트

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

설명:

^:2 -다음을 두 번 반복하십시오.

@|: -전치

#\ -접두사 (1, 2, 3 ... 행)의 길이를 찾으십시오.

_1^ --1을 위의 거듭 제곱으로 올리고 -1 1 -1 1을 번갈아 표시합니다.

|."_1~ -위 목록에서 오프셋으로 입력 배열의 각 행을 회전

온라인으로 사용해보십시오!

원본 버전 :

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

작동 원리

^:2 -다음을 두 번 반복하십시오.

|: -전치

|."0 1] -입력 배열의 각 행, 목록의 오프셋을 회전시킵니다.

@# -배열 내의 행수

($_1 1"0) -대체 _1 1 (3-> _1 1 _1)

온라인으로 사용해보십시오!


1
_1 1..사용하여 생성 할 (|."_1~_1^2|#\)@|:^:2수도 있습니다
마일

@miles 감사합니다. 훌륭한 코드입니다!
Galen Ivanov

@ 마일 실제로 나는 2|부분이 필요하지 않습니다
Galen Ivanov

1
그렇습니다. 실제로 2 바이트가 절약되었습니다.
마일



2

APL + WIN, 30 바이트

2D 어레이의 화면 입력을위한 프롬프트

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

2

APL (Dyalog Unicode) , 26 바이트

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

온라인으로 사용해보십시오!

접두사 Dfn.

어떻게?

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

자바 스크립트 (ES6), 94 91 바이트

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

아마도 회전을 수행하는 골퍼 방법이있을 것입니다 ...


2

Pyth, 15 바이트

L.e.>b^_1k.Tbyy

온라인으로 사용해보십시오

설명

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 바이트

해결책:

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

예:

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"

설명:

열에 회전을 적용하기 위해 그리드를 뒤집 으면 두 번째 반복이 다시 한 번 뒤집어 회전이 두 번째 패스 의 에 적용됩니다 .

회전은 -1 1 -1 1..회전중인 행 / 열의 길이 목록 을 기반으로합니다 .

읽기 쉬운 이 버전 에서 건강한 9 바이트 를 골라 냈습니다

{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

자바 스크립트 (ES6),  116  76 바이트

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

온라인으로 사용해보십시오!

댓글

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

APL NARS, 36 바이트, 18 자

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

이 {⍵⌽⍨- ×-\ ⍳≢⍵}는 행렬 인수의 각 행을 벡터 -1 1-1 1 등을 따라 회전합니다 (벡터 길이는 인수 행렬 행의 길이입니다). 테스트:

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


0

bash et al, 84

비경쟁 쉘 솔루션.

이것은 행의 회전 방향을 바꾸는 함수를 기반으로합니다. 조옮김 배열에서 수행 된 동일한 절차로 열이 회전합니다. 예를 들면 transpose | rotate | transpose | rotate.

다음과 sed같이 단일 문자 배열에서 교대 회전을 수행 할 수 있습니다 .

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

조바꿈을 수행 할 수 있습니다 rs또는 datamash:

rs -g1 -T
datamash -t' ' transpose

함께 찍은 :

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

산출:

o k g m i
l c n e a
j f b h d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.