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