행렬에서 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.