CJam,61 59 43 40 38 36字节
{{_N/eeSf.*:sW%zsS-\{_' >{;(}&+}/}*}
这是一个匿名函数,期望在堆栈上有一个字符串和一个整数。
感谢@ jimmy23013高尔夫球了19个字节。
在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行(左图)前添加n-1个空格。然后,我们反转行的顺序(如右图所示)。
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.
_,,Sf*\.+W%ze_
。