输出2D阵列的逆时针向内螺旋


15

这个 stackoverflow问题

给定大小为的2D数组,以逆时针方式输出值。输出必须从外部到内部开始,并且起始点始终为。M×N(0,0)

给出的例子

[12345678910111213141516]

那么逆时针的边值是。1,5,9,13,14,15,16,12,8,4,3,2

现在,我们对内部值重复此过程。最终将得到如下矩阵

[671011]

然后内部值为6,10,11,7

最终结果将是1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7


规则

  • 假设非空输入
  • 假设矩阵值为正整数
  • 适用标准I / O方法
  • 适用标准规则和获胜标准

一些测试用例

Input
[
  [1, 2, 3, 4, 5, 6, 7],
  [8, 9, 10,11,12,13,14],
  [15,16,17,18,19,20,21]
]
Output
1,8,15,16,17,18,19,20,21,14,7,6,5,4,3,2,9,10,11,12,13

--------------------------------------------------------

Input
[
    [1,2,3],
    [3,2,1],
    [4,5,6],
    [6,5,4],
    [7,8,9],
    [9,8,7]
]
Output
1,3,4,6,7,9,8,7,9,4,6,1,3,2,2,5,5,8

-----------------------------------------------------
Input
[
    [1]
]
Output
1
-----------------------------------
Input
[
    [1, 2],
    [2, 1]
]
Output
1,2,1,2
-----------------------------------------------------
Input
[
    [1,2,3,6,7],
    [2,4,3,2,1],
    [3,2,4,5,6],
    [6,5,6,5,4],
    [10,4,7,8,9],
    [12,4,9,8,7]
]
Output
1,2,3,6,10,12,4,9,8,7,9,4,6,1,7,6,3,2,4,2,5,4,7,8,5,5,2,3,4,6

那么我们是顺时针还是逆时针?
LegionMammal978 '18 -10-11

@ LegionMammal978逆时针旋转(虽然我称其为逆时针旋转)
路易斯·费利佩·德·耶稣·穆诺兹

7
逆时针和逆时针都正确,分别在BrEng和AmEng中更常见。如果您真的想混淆,也可以使用widdershins
Digital Trauma'Oct

Answers:


12

R,54个字节

@Giuseppe和@ J.Doe保存了几个字节。

f=function(m)if(ncol(m))c(m[,1],f(t(m[nrow(m):1,-1])))

在线尝试!

递归剥离第一列,然后对矩阵的其余部分进行行反向/转置(使底部行成为新的第一列),直到最后只剩下一列。非高尔夫的“传统”版本:

f <- function(m) {
 if(ncol(m) == 1) {
    m
  } else {
    c(m[,1], f(t(m[nrow(m):1,-1])))
  }
}

有人指出,ncol(m)可以这样做以sum(m)节省另一个字节,因为我们被允许假定为正整数矩阵值。但是我会这样保留它,因为它适用于所有矩阵(甚至是字符串矩阵!)


哇!我喜欢如何使用t()防止drop=TRUE默认值`[`搞乱if条件!
朱塞佩

并全面披露,我有一个大约200字节的解决方案甚至无法正常工作,所以对您而言,我感到很荣幸!一旦有资格获得赏金,我可能会奖励给您赏金。
朱塞佩

@Giuseppe返回59字节!令我惊喜的t()是不必使用is.null最初尝试的测试。
ngm

那最后不是不是mnull吗,所以您可以将if语句更改为54 bytes。似乎适用于测试用例。
J.Doe '18 -10-11


7

Pyth,9个字节

shMM.utC_

在这里尝试!

怎么样?

shMM.utC_     Full program. Takes a 2D array (matrix) from STDIN.
    .u        Until a result that has occurred before is found, loop and collect...
        _     Reverse the matrix (reverse the order of its rows).
       C      Transpose.
      t       Remove first element.
 hMM          For each element in the resulting 3D array, get the heads of its elements.
s             Flatten.

这很酷。作为Pyth初学者,我现在知道我有很多东西要学习
ElPedro '18

5

Stax,7 个字节

ôQÖG·í<

运行并调试

它在一行上采用行的数组,并产生换行符分隔的输出。

拆开包装,松开包装并进行评论,看起来像这样。

W       repeat the rest of the program until cancelled explicitly
  rM    rotate matrix *clock-wise* (yes, this is the opposite of the challenge)
  |c    assert matrix is truthy. (has rows) cancel otherwise.
  B     remove the top row of the matrix, and push separately to main stack
  rm    reverse the top row (this fixes the rotation direction), and print each value

运行这个


4

Pyth,20个字节

J.TQWJ=+YhJ=J_.TtJ)Y

在这里尝试

说明

J.TQWJ=+YhJ=J_.TtJ)Y
J.TQ                    Call the transposed input J.
    WJ            )     While J is not empty...
      =+YhJ             ... put the top row into Y (initially [])...
           =J   tJ      ... remove the top row...
             _.T        ... reverse and transpose (rotate clockwise).
                   Y    Output the result.

4

OK,12字节

*+,/(1_+|:)\

在线尝试!

这滥用了oK似乎不太关心换位形状的事实。以k计为13个字节*:',/(1_+|:)\

       +|:   /reverse, then transpose (rotate right)
     1_      /remove first line
    (     )\ /fixpoint of the above, keeping intermediate results (scan)
  ,/         /concatenate all the rows
*+           /get the first element of each row

3

干净,69字节

import StdEnv,StdLib
? =transpose
@[h:t]=h++ @(reverse(?t))
@_=[]

@o?

在线尝试!

将下一行/列移动到列表的开头,以便可以在参数中进行模式匹配。

对于挑战中的第一个示例,它看起来像:

@o? [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
@ h=:[1, 5, 9, 13] t=:[[2, 6, 10, 14], [3, 7, 11, 15], [4, 8, 12, 16]]
[1, 5, 9, 13] ++ @ h=:[14, 15, 16] t=:[[10, 11, 12], [6, 7, 8], [2, 3, 4]]
[1, 6, 9, 13, 14, 15, 16] ++ @ h=:[12, 8, 4] t=:[[11, 7, 3], [10, 6, 2]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4] ++ @ h=:[3, 2] t=:[[7, 6], [11, 10]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2] ++ @ h=:[6, 10] t=:[[7, 11]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2, 6, 10] ++ @ h=:[11, 7] t=:[]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2, 6, 10, 11, 7] ++ @ []

3

朱莉娅0.7,47字节

f(m)=[m[:,1];sum(m)<1?[]:f(rotr90(m[:,2:end]))]

在线尝试!

Julia具有一个方便的内置函数,可以将矩阵旋转90度,而无需进行转置-反转操作。

从编译器警告中可以看到,它坚持认为三元条件的所有组件都应由空格分隔,并且在v。1.0中已实际执行。

奇怪的是,在这种情况下,我发现打破递归的最短方法是使用try-catch块:

朱莉娅1.0,50字节

f(m)=[m[:,1];try f(rotr90(m[:,2:end]))catch;[]end]

在线尝试!


2

JavaScript(Node.js),89字节

f=a=>a>[]?[...a.map(x=>x[0]),...f(a[0].map((_,i)=>a.map(y=>y[i]).reverse()).slice(1))]:[]

在线尝试!

取第一列,转置其余的列,然后反转每一行(将矩阵逆时针旋转90度),然后重复直到该数组没有更多条目为止。


2

APL(Dyalog)24 22字节

{×≢⍵:⍵[;1],∇⍉⊖0 1↓⍵⋄⍬}

在线尝试!

怎么样?

{×≢⍵:⍵[;1],∇⍉⊖0 1↓⍵⋄⍬}
{                    } - a function
 ×≢⍵:                  - if non-empty:
     ⍵[;1]             - the left column
          ,∇⍉⊖0 1↓⍵    - repeat this function without the left column, rotated counter clockwise
                   ⋄⍬  - otherwise, return an empty vector

操作员的解释会很好。
Arc676

1
@ Arc676,添加!
扎卡里

2

05AB1E13 11 10 字节

ΔRøćRˆ}¯˜þ

-2个字节,感谢@Emigna

在线尝试验证所有测试用例

说明:

Δ         # Loop until the stack no longer changes:
 R        #  Reverse the order of the rows
          #   i.e. [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
          #    → [[13,14,15,16],[9,10,11,12],[5,6,7,8],[1,2,3,4]]
  ø       #  Zip, swapping rows and column
          #   → [[13,9,5,1],[14,10,6,2],[15,11,7,3],[16,12,8,4]]
   ć      #  Head extracted
          #   → [[14,10,6,2],[15,11,7,3],[16,12,8,4]] and [13,9,5,1]
    R     #  Reverse this row
          #   → [1,5,9,13]
     ˆ    #  Pop and push it to the global array
}         # After the loop:
 ¯        #  Push the global array
          #   i.e. [[1,5,9,13],[14,15,16],[12,8,4],[3,2],[6,10],[11],[7],"",""]
  ˜       #  Flatten it
          #   → [1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7,"",""]
   þ      #  Remove all empty string by only leaving all digits
          #   → ["1","5","9","13","14","15","16","12","8","4","3","2","6","10","11","7"]
          # (and output it implicitly)


1

木炭,25字节

≔⮌EA⮌ιθWθ«≔E§θ⁰⮌Eθ§μλθI⊟θ

在线尝试!链接是详细版本的代码。说明:

≔⮌EA⮌ιθ

将输入旋转180°。这有两个原因:a)最容易删除的是最后一行; b)如果在循环结束时删除了该行,则更容易循环。(我确实尝试过反射并顺时针输出,但这花了一个额外的字节。)

Wθ«

重复直到数组为空。

≔E§θ⁰⮌Eθ§μλθ

将阵列旋转90°。

I⊟θ

删除数组的最后一行,并将元素作为字符串打印在单独的行上。



1

PowerShell,266字节

是的。PowerShell不是处理矩阵的最佳选择。但是,该算法与上面的算法基本相同。每一行都用逗号分隔的字符串表示,并且我们基本上对每一层进行旋转和转置。我大概可以刮胡子更多了,但...... 早就在我的睡衣......

Filter F{$a=$_-replace"],|]|\s",''-split'\['|?{$_-ne''};$b=@();while($a-ne $null){$N=($a[0]-split',').Count-1;$a=0..$N|%{$i=$_;($a|%{($_-split',')[$i]})-join','};if($d){[array]::Reverse($a)}if($N-gt0){$b+=$a[0];$a=$a[1..$N]}else{$b+=$a;$a=$null};$d=$true}$b-join','}

在线尝试!

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.