인터레이스 회전


25

도전

문자의 제곱 행렬 (1 바이트 인쇄 가능한 ASCII 문자)이 주어지면 행렬의 각 "링"을 반대 방향으로 회전하십시오.

예를 들어 보자.

1 2 3 4 5
6 7 8 9 A
B C D E F
G H I J K
L M N O P

그런 다음 가장 바깥 쪽 링을 시계 방향으로 90도 회전합니다.

1 2 3 4 5    L G B 6 1
6       A    M       2
B       F => N       3
G       K    O       4
L M N O P    P K F A 5

두 번째 링은 시계 반대 방향으로 90도 회전합니다.

7 8 9    9 E J
C   E => 8   I
H I J    7 C H

최종 링은 시계 방향으로 90도 회전하지만 단일 숫자이므로 (이 예에서는 문자) 영향을받지 않습니다.

최종 결과는 다음과 같습니다.

L G B 6 1
M 9 E J 2
N 8 D I 3
O 7 C H 4
P K F A 5

매트릭스의 측면 길이가 균등 한 경우 가장 안쪽 링은 2x2 정사각형이며 계속 회전해야합니다.

입력

합리적인 표준 형식의 목록 목록. 예를 들어, 줄 바꿈으로 구분 된 공백으로 구분 된 문자열 또는 공백으로 구분 된 문자열 목록은 허용되지만 행렬 주위의 고리로 표시되는 값 목록은 허용되지 않습니다. 문자가 반드시 고유하지는 않습니다.

산출

합리적인 표준 형식의 목록 목록. 입력과 동일한 규칙입니다.

테스트 사례

1 2 3    7 4 1
4 5 6 => 8 5 2
7 8 9    9 6 3

1 2 3 4 5 6    Y S M G A 1
A B C D E F    Z E K Q W 2
G H I J K L => ! D O I V 3
M N O P Q R    @ C P J U 4
S T U V W X    # B H N T 5
Y Z ! @ # $    $ X R L F 6

크레딧

각 요소를 시계 반대 방향으로 한 위치 (90도 아님)로 회전 시키는 관련 문제에 크게 영향을받습니다 .



@ rahnema1 맞아, 나는 그 포스트를 기억한다. 이 게시물은 대부분 그 게시물에서 영감을 얻었습니다. 나는 신용 할 것이다. 감사!
HyperNeutrino 2016 년

@ Mr.Xcoder Whoops. 네 말이 맞아, 고마워
HyperNeutrino 2016 년

@HyperNeutrino 입력의 일부로 행렬의 차원을 취할 수 있습니까?
Uriel

예제의 모든 문자는 고유합니다. 이것이 항상 그렇습니까?
데니스

답변:


9

하스켈 , 94 바이트

익명의 기능을 복용하고 목록 반환 String들.

로 사용하십시오 (cycle[t.r,r.t,r.t,r.t]?)["123", "456", "789"].

(cycle[t.r,r.t,r.t,r.t]?)
(g:h)?(a:b)=g$a:h?t(r b)
_?a=a
r=reverse;t=zipWith(:)`foldr`repeat[]

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

작동 원리

  • r입니다 reverse. timporting보다 1 바이트 짧다 Data.List.transpose. t.r목록 목록을 시계 방향으로 90도 r.t회전하고 시계 반대 방향으로 회전합니다.
  • 연산자 ?는 두 개의 인수, 함수 목록과 행렬을 문자열 목록으로 취합니다.
    • 빈 행렬이 방금 반환됩니다.
    • 그렇지 않으면 ?함수 f목록 에서 첫 번째 함수를 a제거하고 행렬 에서 첫 번째 함수를 제거합니다 .
    • 그런 다음 나머지 b행렬을 시계 방향으로 회전시키고 나머지 기능과 함께 반복합니다. 이렇게하면 4 단계마다 하나씩 링에서 바깥쪽으로 매트릭스가 점차 제거됩니다.
    • 그런 다음 원래 줄 a을 결과 앞에 추가하고 함수 f를 적용 하여 행렬의 방향을 조정합니다.
  • 익명 함수 ?는 입력 행렬을 문자열 목록으로, 무한 함수 목록을 호출하여 4 단계마다 주기적으로 반복됩니다.
    • 대부분의 단계에서이 기능은 반 시계 방향 회전으로, ?재귀시 수행되는 암시 적 시계 방향 회전을 취소합니다 .
    • 그러나 그 이후의 첫 번째 단계와 매 번째 네 번째 단계는 대신 시계 방향 회전입니다.
      • 이 기능은 매트릭스의 링이 완료 될 때 적용되어 각 링이 다음 링에 대해 180도 회전합니다.
      • 운 좋게도 이것은 최종 결과를 얻기 위해 완성 된 최종 행렬에 적용되는 올바른 변환이기도합니다.

6

파이썬 2 , 104 바이트

def f(x):l=len(x)-1;r=range(l+1);return[[[x[l-i][j],x[i][l-j]][min(i,j,l-i,l-j)%2]for i in r]for j in r]

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

x[l-i][j]x[i][l-j]반 시계 방향으로 돌리기 위해 시계 방향으로 돌리는 좌표입니다 . min(i,j,l-i,l-j)%2올바른 방향을 선택하는 데 사용됩니다


재귀 적으로 회전을 반환합니다.
tuskiomi 2016 년

트윗 담아 가기
Rod

@tuskiomi 나는 ES6에서 재귀 접근법을 시도했습니다. 이 답변의 간단한 포트보다 두 배나 길었습니다.
Neil

4

수학, 113 바이트

r=Reverse;(l=Length[s=#];Table[s[[i+1;;l-i,i+1;;l-i]]=r/@r@s[[i+1;;l-i,i+1;;l-i]],{i,⌊l/2⌋}];r/@Transpose@s)&


E, I와 같은 특수 문자의 경우 "E"와 같은 문자 스트링으로 입력하는 것이 좋습니다.

입력

[{{1, 2, 3, 4, 5, 6}, {A, B, C, D, "E", F}, {G, H, "I", J, K, L}, {M , N, O, P, Q, R}, {S, T, U, V, W, X}, {Y, Z, "!", "@", "#", "&"}}]

산출

{{Y, S, M, G, A, 1}, {Z, "E", K, Q, W, 2}, { "!", D, O, "I", V, 3}, { "@", C, P, J, U, 4}, { "#", B, H, N, T, 5}, { "&", X, R, L, F, 6}}


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