도전
문자의 제곱 행렬 (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
매트릭스의 측면 길이가 균등 한 경우 가장 안쪽 링은 2×2 정사각형이며 계속 회전해야합니다.
입력
합리적인 표준 형식의 목록 목록. 예를 들어, 줄 바꿈으로 구분 된 공백으로 구분 된 문자열 또는 공백으로 구분 된 문자열 목록은 허용되지만 행렬 주위의 고리로 표시되는 값 목록은 허용되지 않습니다. 문자가 반드시 고유하지는 않습니다.
산출
합리적인 표준 형식의 목록 목록. 입력과 동일한 규칙입니다.
테스트 사례
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도 아님)로 회전 시키는 관련 문제에 크게 영향을받습니다 .
답변
하스켈 , 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
.t
importing보다 1 바이트 짧다Data.List.transpose
.t.r
목록 목록을 시계 방향으로 90도r.t
회전하고 시계 반대 방향으로 회전합니다.- 연산자
?
는 두 개의 인수, 함수 목록과 행렬을 문자열 목록으로 취합니다.- 빈 행렬이 방금 반환됩니다.
- 그렇지 않으면
?
함수f
목록 에서 첫 번째 함수를a
제거하고 행렬 에서 첫 번째 함수를 제거합니다 . - 그런 다음 나머지
b
행렬을 시계 방향으로 회전시키고 나머지 기능과 함께 반복합니다. 이렇게하면 4 단계마다 하나씩 링에서 바깥쪽으로 매트릭스가 점차 제거됩니다. - 그런 다음 원래 줄
a
을 결과 앞에 추가하고 함수f
를 적용 하여 행렬의 방향을 조정합니다.
- 익명 함수
?
는 입력 행렬을 문자열 목록으로, 무한 함수 목록을 호출하여 4 단계마다 주기적으로 반복됩니다.- 대부분의 단계에서이 기능은 반 시계 방향 회전으로,
?
재귀시 수행되는 암시 적 시계 방향 회전을 취소합니다 . - 그러나 그 이후의 첫 번째 단계와 매 번째 네 번째 단계는 대신 시계 방향 회전입니다.
- 이 기능은 매트릭스의 링이 완료 될 때 적용되어 각 링이 다음 링에 대해 180도 회전합니다.
- 운 좋게도 이것은 최종 결과를 얻기 위해 완성 된 최종 행렬에 적용되는 올바른 변환이기도합니다.
- 대부분의 단계에서이 기능은 반 시계 방향 회전으로,
답변
파이썬 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
올바른 방향을 선택하는 데 사용됩니다
답변
수학, 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}}
답변
옥타브, 86 바이트
@(a){k=a;k(x=2:end-1,x)=0;a=rot90(a);a(m)=rot90(a,-2)(m=~mod(bwdist(+k,'ch'),2));a}{5}