旋转矩阵中的每个2x2块


11

挑战

给定一个n x m矩阵,n > 1m > 1 用整数填充

1 2 3
4 5 6

以及具有与2x2矩阵中的块数量一样多的值的整数列表((n-1)*(m-1)如果需要确切的数字)

[1,2]

2x2以给定的顺序输出矩阵,其中每个块按列表中的当前值旋转。上面的例子会产生

4 6 2
5 3 1

第一块向右旋转一次,第二块向右旋转两次。

笔记

  • 正整数表示您向右旋转了许多步。
  • 负整数表示您向左旋转了这么多步。
  • 零表示您不旋转。
  • 您逐行旋转块。这意味着您从第一行开始,然后转到右侧。旋转该行中的每个块后,您将转到下一个块。最后,每个程序块仅旋转一次。
  • 请记住,这些块相互重叠。上述第一矩阵具有块[[1,2],[4,5]][[2,3],[5,6]]例如。
  • 块的每次旋转都会影响相邻块的旋转。这就是为什么您必须按照上述模式进行旋转。

规则

  • 您可以采用最方便的格式输入。请在您的答案中指定使用哪一个。这并没有让你读矩阵逐块虽然。
  • 允许功能或完整程序。
  • 输入/输出的默认规则
  • 有标准漏洞
  • 这是,因此最低字节数获胜。Tiebreaker是较早提交的内容。

测试用例

输入格式是矩阵列表和值的常规列表。

[[1,2],[3,4]],[-3]-> [[4,1],[3,2]]
[[1,1,1],[1,1,1]],[-333,666]-> [[1,1,1],[1,1,1]]
[[1,2,3],[4,5,6]],[1,2]-> [[4,6,2],[5,3,1]]
[[1,2,3],[4,5,6],[7,8,9]],[4,0,12,-20]-> [[1,2,3],[4, 5,6],[7,8,9]
[[1,2,3,4,5],[5,4,3,2,1],[1,2,3,4,5]],[2,-3,4,1,6, 24,21,-5]-> [[4,1,5,2,4],[2,1,3,5,5],[3,2,4,3,1]]

编码愉快!

Answers:


4

CJam(42 40字节)

{(\@2$,(/.{@a@a+z(\@.{4,={+2/zW%~}*}z~}}

在线演示

基本上,这两次应用相同的技术来折叠块

{4,={+2/zW%~}*}

它在2x2矩阵上运行并旋转多次。

[first row] [[second row] [third row] ... [last row]] [value_0 value_1 ... value_n]

可以用

.{block}

并具有

[first row]
[second row] value_0 {block}~
[third row] value_1 {block}~
...

因为.(例如%在CJam中)在完成之前不会将结果收集到数组中。


您可以通过使用4,=正确的模来保存字节(除非您的块至少需要运行一次?)。
马丁·恩德

zW%旋转又如何呢?
马丁·恩德

@MartinBüttner,我认为轮换的时间似乎太长,但我不记得轮换的时间短了。模数上的好技巧。
彼得·泰勒

2

CJam,65 63 60 55字节

必须是一个更好的办法来做到这一点?

{_e_\z,:N(@/Ta*ee{~4,=,f{;1$,,\[XTN_)]f+_(+er\f=}~}/N/}

这是一个未命名的函数,它期望指令和矩阵(按顺序)位于堆栈上,并将结果矩阵保留在原处。

在这里测试。

说明

我现在不希望为代码编写完整的细分,因此这里有一个大概的概述:

  • 2D数组操作是CJam中的一个难题,因此我将展开矩阵,将每个旋转计算为元素在特定位置的排列,然后在最后将数组再次拆分为行。矩阵的宽度存储在中N
  • 在位置A旋转k展开的阵列中的改变四项指数:k <- k+1k+1 <- k+1+Nk+N <- kk+1+N <- k+1。对于k指令列表中的每个索引,我都会计算与之对应的一个排列,并将其应用于展开的输入数组。
  • 这就留下了问题,在线性数组中,某些旋转将被定位,其左上角在输入的最后一列。为了跳过这些,我将零填充到指令列表中,以便对这些无效的2x2子块进行技术处理,但没有操作。

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.