중국어 바둑판은 다음과 같습니다 ( 이 질문에 기반 하지만 이번에는 고정 크기입니다).
G
. G
G G G
G G . G
B B B B . . Y G . Y . Y Y
B B B . . G . . . Y Y Y
B . B . . . . . Y . Y
B . . . . . . . . Y
. . . . . . . . .
. P . . . . . O O .
P P . . . . . . . O O
P P P . . . R . . O O .
P P P P . . R . . O O O O
R . R R
R R R
R .
R
이 예에서 공백이 아닌 문자는 입력에서 공백이 아닌 인쇄 가능한 ASCII 문자로 대체 될 수 있지만 공백은 변경되지 않습니다. 중국어 체커에서는 유효한 배열이 보장되지 않습니다 (예 : 정확히 7 가지의 다른 문자가 없을 수 있음).
당신의 임무는 60 도의 배수로 회전하는 것입니다.
위의 예는 시계 방향으로 60도 회전합니다.
B
B B
B B B
B . B B
P P P . . . B . . G G . G
P P P P . . . . . G G G
P P . . . . . G Y . G
P . . . . . . . G G
. . . . . . . . .
R . . . . . . . . Y
R . R R . . . . Y Y .
R R R . . . O . . . Y Y
R . R R . . . O . Y Y Y Y
O O O .
O O O
O .
O
입력은 음이 아닌 정수이며 중국어 바둑판입니다. 프로그램 (또는 함수)은 정수 * 60도 회전해야합니다. 일관된 한 시계 방향 또는 반 시계 방향으로 회전할지 결정합니다. 입력과 출력 모두에 선행 또는 후행 공백이 없어야합니다.
이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다.
답변
CJam, 61 59 43 40 38 36 바이트
{{_N/eeSf.*:sW%zsS-\{_' >{;(}&+}/}*}
이것은 스택에서 문자열과 정수를 기대하는 익명 함수입니다.
19 바이트의 골프를 즐기신 @ jimmy23013에게 감사드립니다.
CJam 통역사 에서 온라인으로 사용해보십시오 .
생각
바둑판의 인쇄 가능한 문자를 동쪽에서 남쪽으로 읽음으로써 주문을 할당 할 수 있습니다.
이렇게하면 원래의 회전 된 바둑판
G B
. G B B
G G G B B B
G G . G B . B B
B B B B . . Y G . Y . Y Y P P P . . . B . . G G . G
B B B . . G . . . Y Y Y P P P P . . . . . G G G
B . B . . . . . Y . Y P P . . . . . G Y . G
B . . . . . . . . Y P . . . . . . . G G
. . . . . . . . . . . . . . . . . .
. P . . . . . O O . R . . . . . . . . Y
P P . . . . . . . O O R . R R . . . . Y Y .
P P P . . . R . . O O . R R R . . . O . . . Y Y
P P P P . . R . . O O O O R . R R . . . O . Y Y Y Y
R . R R O O O .
R R R O O O
R . O .
R O
지다
G.GGGGGG.GBBBB..YG.Y.YYBBB..G...YYYB.B.....Y.YB........Y..........P.....OO.PP.......OOPPP...R..OO.PPPP..R..OOOOR.RRRRRR.R
과
BBBBBBB.BBPPP...B..GG.GPPPP.....GGGPP.....GY.GP.......GG.........R........YR.RR....YY.RRR...O...YYR.RR...O.YYYYOOO.OOOO.O
각기.
첫 번째 바둑판에서 문자를 북동쪽으로 읽은 다음 남동쪽으로 읽으면 두 번째 시퀀스를 찾을 수 있습니다.
코드에서 이것을 달성하기 위해, 우리는 n-1 공백을 바둑판 의 n 번째 행 앞에 추가 합니다 (왼쪽에 표시됨). 그런 다음 행의 순서를 반대로 바꿉니다 (오른쪽에 표시).
G R
. G R .
G G G R R R
G G . G R . R R
B B B B . . Y G . Y . Y Y P P P P . . R . . O O O O
B B B . . G . . . Y Y Y P P P . . . R . . O O .
B . B . . . . . Y . Y P P . . . . . . . O O
B . . . . . . . . Y . P . . . . . O O .
. . . . . . . . . . . . . . . . . .
. P . . . . . O O . B . . . . . . . . Y
P P . . . . . . . O O B . B . . . . . Y . Y
P P P . . . R . . O O . B B B . . G . . . Y Y Y
P P P P . . R . . O O O O B B B B . . Y G . Y . Y Y
R . R R G G . G
R R R G G G
R . . G
R G
마지막으로 행을 열로 바꿉니다.
B
BB
BBB
B.BB
PPP...B..GG.G
PPPP.....GGG
PP.....GY.G
P.......GG
.........
R........Y
R.RR....YY.
RRR...O...YY
R.RR...O.YYYY
OOO.
OOO
O.
O
공백은 도처에 있지만 인쇄 가능한 문자는 동쪽으로 읽은 다음 남쪽으로 읽으면 올바른 순서입니다.
할 남은 것을 모두는 대체 N을 번째 바이 원래 체크 무늬의 인쇄 가능한 문자 N 일 마지막 수정의 인쇄 가능한 문자.
암호
e# Stack: String B, Integer A
{ }* e# Repeat A times:
_N/ e# Push a copy of B and split it at linefeeds.
ee e# Enumerate the lines of B.
Sf.*:s e# Execute S.*s for each line:
e# [4 "abc"] -> " abc"
W% e# Reverse the order of line lines.
z e# Zip; transpose rows with columns.
s e# Flatten the arrays of strings.
S- e# Remove spaces.
e# This pushes a string L.
\{ }/ e# For each character C in the unmodified B:
_' > e# Check if C is bigger than ' '.
{ }& e# If it is:
;( e# Discard C and shift out a char from L.
+ e# Append a char (C or from L) to L.
e# L is B rotated by 60 degrees. Set L := B.
답변
파이썬 2, 171 바이트
def f(S,n):
o="";E=enumerate;B=S.splitlines(1)
for r,l in E(B):
for c,q in E(l):z=r-8;y=6-(z+c)/2;x=-y-z;exec"x,y,z=-y,-z,-x;"*n;o+=q*(q<"!")or B[z+8][12-y+x]
print o
이것은 아마도 내가 찾은 유일한 시간 일 것입니다 . str.splitlines
다른 모든 경우 .split("\n")
에는 더 짧습니다.
처럼 사용하십시오 f(S,10)
.
설명
입력의 각 문자에 대해 다음 중 하나를 수행합니다.
- 공백이나 줄 바꿈 인 경우 보관하거나
- 그렇지 않으면 올바른 문자로 교체하십시오
대체 할 문자를 알아 내기 위해 그리드를 큐브 좌표 로 변환하고 변환하여 시간을 (x, y, z)
회전 한 다음 다시 변환합니다.n
(x, y, z) -> (-y, -z, -x)