행렬의 모든 행과 열을 회전


15

도전

주어진 n x n정수 행렬n >= 2

1 2
3 4

정확히 2n요소 가있는 정수 목록

[1,2, -3, -1]

회전 된 행렬을 출력합니다. 이 매트릭스는 다음과 같은 방식으로 구성됩니다.

  • 목록에서 첫 번째 정수를 가져 와서이 값만큼 첫 번째 행을 오른쪽으로 회전하십시오.
  • 다음 정수를 가져 와서 첫 번째 열을이 값만큼 아래로 회전하십시오.
  • 다음 정수를 가져 와서 행렬의 모든 행과 열을 한 번 회전 할 때 까지이 값 등으로 두 번째 행을 오른쪽으로 회전하십시오.

목록에는 음의 정수가 포함될 수 있습니다. 즉, 오른쪽 / 아래가 아닌 행 / 열을 왼쪽 / 위로 이동합니다. 정수가 0이면 행 / 열을 회전시키지 마십시오.

위 입력을 사용한 예

리스트 요소 매트릭스 설명
-------------------------------------------------- ----------
1 2 1 1 행을 1 씩 오른쪽으로 회전
                   3 4

2 2 1 첫 번째 열을 2만큼 아래로 회전
                   3 4

-3 2 1 2 행을 3만큼 왼쪽으로 회전
                   4 3

-1 2 3 두 번째 열을 1 씩 회전
                   4 1

규칙

  • 가장 편리한 입력 형식을 선택할 수 있습니다. 어떤 것을 사용하는지 명확하게하십시오.
  • 기능 또는 전체 프로그램이 허용됩니다.
  • 입 / 출력의 기본 규칙 .
  • 표준 허점이 적용됩니다.
  • 이것은 이므로 바이트 수가 가장 적습니다. Tiebreaker는 이전에 제출되었습니다.

테스트 사례

여기에 입력 형식은 행렬 목록과 정수에 대한 일반 목록입니다.

[[1,2], [3,4]], [1,2, -3, -1]-> [[2,3], [4,1]]
[[1,2], [3,4]], [1,1,1,1]-> [[3,2], [4,1]]
[[1,2], [3,4]], [0,0,0,0]-> [[1,2], [3,4]]
[[1,2, -3], [-4,5,6], [7, -8,0]], [1, -2,0, -1,3,4]-> [[7, 5,0], [-3, -8,2], [-4,1,6]]
[[1,2, -3], [-4,5,6], [7, -8,0]], [3,12, -3,0, -6, -3]-> [[1 , 2, -3], [-4,5,6], [7, -8,0]]

행복한 코딩!


mapcar 도움이 될 것입니다…
msh210

답변:


6

CJam, 13 바이트

{{a.m>1m<z}/}

명명되지 않은 블록 (함수)은 스택의 맨 위에있는 행렬과 목록을 가져 와서 새 행렬을 제자리에 둡니다.

모든 테스트 사례를 실행하십시오.

동일한 아이디어, 동일한 바이트 수, 다른 구현 :

{{\(@m>a+z}/}
{{(Im>a+z}fI}
{{:\Im>]z}fI}

설명

이상적으로는 목록의 각 명령을 동일하게 취급하고 행렬의 첫 번째 행을 회전시키는 데 사용하는 것이 좋습니다. 이것은 각 명령 후에 행렬을 약간 변환하고 모든 추가 변환이 결국 취소되도록함으로써 매우 쉽게 수행 할 수 있습니다. 따라서 각 명령어를 처리 한 후에는 모든 행을 하나 위로 회전 하고 (같은 차원을 따라 다음 명령어가 다음 행을 처리하도록) 행렬을 바꿉니다. 그러면 실제로 다음에 열을 처리하게됩니다. 이러한 추가 변환은 목록의 지침과 직교하며 정확히 2n필요한 기간을 갖습니다 .

코드는 다음과 같습니다.

{      e# For each instruction...
  a    e#   Wrap it in a singleton array.
  .m>  e#   Combine it element-wise with the matrix to rotate right. This is
       e#   a fairly common idiom to apply a binary operation only to the first
       e#   element of an array, since element-wise operations just retain all the
       e#   unpaired elements of the longer array.
  1m<  e#   Rotate the rows one up.
  z    e#   Transpose.
}/

4

APL (Dyalog Extended) , 17 15 14 13 바이트

Adám으로 -3 바이트

(⍉1⊖⌽`@1⍢⌽)/⌽

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

첫 번째 요소가 행렬이고 나머지 요소가 회 전량 인 목록으로 입력을받습니다. ⌽가 왼쪽 대신 오른쪽으로 회전하면 CJam을 이길 것입니다.

(⍉1⊖⌽@1 1⍢⌽)/⌽    Monadic train:
(⍉1⊖⌽@1 1⍢⌽)      Helper function to rotate and transpose once.
                        Takes args  (amount to rotate) and  (current array)
                      Function to rotate left
        1 1             2-element vector containing 1.
                        The second 1 is redundant, but saves 1 byte over (,1).
     ⌽@1 1             Function to rotate the 1st row left by ⍺.
     ⌽@1 1⍢⌽          Reverse ⍵, rotate 1st row left by ⍺, then reverse again.
                        This rotates the first row of  to the *right*.
  1                   Rotate all the rows upward,
                                                  then transpose.
(⍉1⊖⌽@1 1⍢⌽)/⌽   Fold (/) this function over the reversed input.
                     If our input is ⍵, _1, _2, ..., _2n,
                     the reversed input will be _2n, ..., _1, ⍵.
                     The / operator applies the function right to left,
                     so the  is necessary.

{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)그러나 왜 @1대신 작동하지 않는지 설명해 주시겠습니까?@(⍳1)@(,1)? 또한 OP를 사용하면 입력을 반대로 할 수 있습니다.
Adám

따라서 at확장 뒤에있는 dfns ' @는 호환되는 확장 이 아닙니다. 그러나 네이티브 @를 사용할 수 있습니다`@1 바이트를 절약하는@1 1 .
Adám

apl 대 J에서 다르게 작동합니까? 나는 이것을 J로 번역하려고하는데 훨씬 더 장황한 것을 발견하고있다.
Jonah

2

파이썬 2, 96 바이트

def f(m,v):
    for i,x in enumerate(v):x%=len(m);r=m[i/2];m[i/2]=r[-x:]+r[:-x];m=zip(*m)
    return m

테스트

f튜플 목록을 반환합니다. 함수 본문의 각 줄은 1 개의 탭 문자로 들여 쓰기됩니다.


return zip(*m)5 바이트를 직접 절약 하지 않겠습니까 ?
Denker

@ DenkerAffe : 당신 m=zip(*m);return m은 단지 대체로 제안하고 return zip(*m)있습니까? 루프 m=zip(*m)의 일부 이기 때문에 그렇게 할 수 없습니다for
vaultah

그래, 그것은 나의 것이었다. 루프에서 그것을 보지 못했습니다.
Denker

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.