행렬에서 2x2 블록마다 회전


11

도전

주어진 n x m와 매트릭스를 n > 1하고 m > 1 정수 가득

1 2 3
4 5 6

2x2행렬의 블록 수만큼 정확하게 값을 가진 정수 목록 ( (n-1)*(m-1)정확한 숫자가 필요한 경우)

[1, 2]

2x2주어진 순서대로 목록의 현재 값만큼 모든 블록을 회전시켜 행렬을 출력합니다 . 위의 예는

4 6 2
5 3 1

첫 번째 블록은 오른쪽으로 한 번 회전하고 두 번째 블록은 오른쪽으로 두 번 회전합니다.

메모

  • 양의 정수는 여러 단계만큼 오른쪽으로 회전한다는 의미입니다.
  • 음의 정수는 여러 단계만큼 왼쪽으로 회전한다는 의미입니다.
  • 0은 회전하지 않음을 의미합니다.
  • 블록을 행 방향으로 회전합니다. 즉, 첫 번째 행에서 시작하여 오른쪽으로 이동합니다. 해당 행의 모든 ​​블록을 회전하면 다음 블록으로 이동합니다. 결국 모든 블록은 정확히 한 번 회전되었습니다.
  • 블록이 서로 겹칩니다. 제 행렬은 상기 블록 보유 [[1,2],[4,5]]하고 [[2,3],[5,6]], 예를 들어.
  • 블록의 각 회전은 인접한 블록의 회전에 영향을줍니다. 그렇기 때문에 위에서 설명한 패턴으로 회전해야합니다.

규칙

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

테스트 사례

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

[[1,2], [3,4]], [-3]-> [[4,1], [3,2]]
[[1,1,1], [1,1,1]], [-333, 666]-> [[1,1,1], [1,1,1]]
[[1,2,3], [4,5,6]], [1,2]-> [[4,6,2], [5,3,1]]
[[1,2,3], [4,5,6], [7,8,9]], [4,0,12, -20]-> [[1,2,3], [4, 5,6], [7,8,9]]
[[1,2,3,4,5], [5,4,3,2,1], [1,2,3,4,5]], [2, -3,4,1,6, 24,21, -5]-> [[4,1,5,2,4], [2,1,3,5,5], [3,2,4,3,1]]

행복한 코딩!

답변:


4

CJam ( 42 40 바이트)

{(\@2$,(/.{@a@a+z(\@.{4,={+2/zW%~}*}z~}}

온라인 데모

기본적으로 이것은 블록을 접기 위해 동일한 기술을 두 번 적용합니다.

{4,={+2/zW%~}*}

이것은 2x2 매트릭스에서 작동하고 여러 번 회전합니다.

[first row] [[second row] [third row] ... [last row]] [value_0 value_1 ... value_n]

처리 할 수 ​​있습니다

.{block}

그리고 효과가

[first row]
[second row] value_0 {block}~
[third row] value_1 {block}~
...

.( %CJam 에서처럼) 결과가 끝날 때까지 결과를 배열로 수집하지 않기 때문 입니다.


4,=올바른 모듈로 를 사용하여 바이트를 저장할 수 있습니다 (블록을 한 번 이상 실행해야하는 경우 제외).
Martin Ender

또한 zW%회전은 어떻습니까?
Martin Ender

@ MartinBüttner, 회전이 너무 길다고 생각했지만 더 짧은 것을 기억할 수 없었습니다. 모듈로에 대한 좋은 트릭.
피터 테일러

2

CJam, 65 63 60 55 바이트

더 좋은 방법 이 있어야합니다 ...

{_e_\z,:N(@/Ta*ee{~4,=,f{;1$,,\[XTN_)]f+_(+er\f=}~}/N/}

이것은 스택에서 명령어와 매트릭스 (순서대로)를 예상하고 결과 매트릭스를 그 자리에 남겨 두는 명명되지 않은 함수입니다.

여기에서 테스트하십시오.

설명

현재 코드에 대한 전체 분석을 작성하고 싶지는 않으므로 대략적인 개요는 다음과 같습니다.

  • 2D 배열 조작은 CJam에서 고통이므로 대신 행렬을 풀고 특정 위치에서 요소의 순열로 각 회전을 계산 한 다음 마지막에 배열을 다시 행으로 분할합니다. 행렬의 너비는에 저장됩니다 N.
  • 회전 위치에서 k펼쳐진 배열 네 인덱스를 변경한다 : k <- k+1, k+1 <- k+1+N, k+N <- k, k+1+N <- k+1. k명령어 목록에있는 각 인덱스에 대해 이에 해당하는 순열을 계산하여 언 롤링 된 입력 배열에 적용합니다.
  • 이것은 선형 배열에서 일부 회전이 입력의 마지막 열에서 왼쪽 상단 모서리에 위치한다는 문제를 남깁니다. 이를 건너 뛰기 위해 명령 목록에서 0을 리플 링하여 유효하지 않은 2x2 서브 블록 기술적으로 처리하지만 작동하지 않습니다.

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