隔行旋转


25

挑战

给定一个字符正方形矩阵(可单字节打印的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

@ Mr.Xcoder糟糕。您说得对,谢谢。
HyperNeutrino

@HyperNeutrino我们可以将矩阵的维数作为输入的一部分吗?
Uriel

示例中的所有字符都是唯一的。会一直这样吗?
丹尼斯,

Answers:


9

Haskell,94个字节

接受并返回Strings 列表的匿名函数。

用作(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[]

在线尝试!

怎么运行的

  • rreverset比导入短一字节Data.List.transposet.r将清单清单顺时针r.t旋转90度,然后逆时针旋转。
  • 运算符?采用两个参数,一个函数列表和一个矩阵作为字符串列表。
    • 只是返回一个空矩阵。
    • 否则,?将第一个功能f从功能列表中删除,并将第一行a从矩阵中删除。
    • 然后,它b顺时针旋转矩阵的其余部分,并使用该函数和其余函数递归。这逐渐从外向内剥离基质,每四步一个环。
    • 然后,将原始行添加a到结果中,并对其应用函数f以调整矩阵的方向。
  • 匿名函数?使用输入矩阵作为字符串列表和无限的函数列表进行调用,该函数列表每四个步骤循环重复一次。
    • 对于大多数步骤,该功能都是逆时针旋转,它消除了递归时执行的隐式顺时针旋转?
    • 但是,第一步和此后的每第四步是顺时针旋转。
      • 当矩阵的一个圆环完成时,将应用此功能,从而使每个圆环相对于下一个圆环旋转180度。
      • 幸运的是,这也是应用于最终的,完成的矩阵以获得最终结果的正确转换。

6

Python 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

@tuskiomi嗯?
Rod:

@tuskiomi我在ES6中尝试了一种递归方法。它大约是此答案的简单端口的两倍……
尼尔

4

Mathematica,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这样的特殊字母,最好以char字符串形式输入,例如“ 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}}


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.