如何在控制台上打印ascii方形螺旋

时间:2015-08-12 19:26:38

标签: javascript algorithm recursion pattern-matching

这是一个我无法弄清楚的面试问题..

将以下输出打印到JavaScript控制台(或您使用的任何控制台)

我解决这个问题的尝试是建立一个恒星阵列和一系列空间。

然后逐行打印每一行,通过添加星星或将星号更改为空格来修改它。

但这并不构成整个螺旋。它只构建了上半部分,所以我想知道是否有更优雅的解决方案?

感觉某种递归函数对此有好处吗?

new RegExp('mystring:.+\|').test('mystring:something|')

编辑:我尝试递归解决方案。我非常接近,但它仍然有点hacky: https://jsfiddle.net/6fa9uty3/

var starLine = [];
var spaceLine = [];
for (var i = 0; i < 33; i++) {
    starLine.push('*');
    spaceLine.push(' ');
}

console.log(starLine.join(' '));
for (var i = 1; i <= 32/2; i+=2) {
    spaceLine[(i-1)] = '*';
    spaceLine[32-(i-1)] = '*';
    starLine[i] = ' ';
    starLine[32-(i)] = ' '; 
    console.log(spaceLine.join(' '));
    console.log(starLine.join(' '));
}

(图片文字无法正确呈现) square spiral

3 个答案:

答案 0 :(得分:1)

解决方案:https://jsfiddle.net/oc5b5qzh/ - 在浏览器中查看控制台窗口以查看螺旋。

保持大小奇怪。我为每种情况使用了不同的字母代替*,这样你就可以看到循环的哪个部分解决了这种情况。显然可以进行更多压缩,但这只会降低其可读性。

注意:与您的确切相符。我认为我的另一个方向是螺旋式的。

var size = 21;

for (var h = 0; h < size; h++) {
    var line = "";
    for (var w = 0; w < size; w++) {
        if (h < size/2) {
            if (h % 2 === 0) {
                if (w >= h && w < size - h) {
                    line += "A";
                }
                else {
                    line += (w % 2 === 0) ? "B" : " ";
                }
            }
            else {
                if (w >= h && w < size - h) {
                    line += " ";
                }
                else {
                    line += (w % 2 === 0) ? "C" : " ";
                }
            }
        }
        else {
            if (h % 2 === 0) {
                if (w < h - 1 && w >= size - h) {
                    line += "D";
                }
                else {
                    line += (w % 2 === 0) ? "E" : " ";
                }
            }
            else {
                if (w < h - 1 && w >= size - h) {
                    line += " ";
                }
                else {
                    line += (w % 2 === 0) ? "F" : " ";
                }
            }
        }
    }
    console.log(line);
}

答案 1 :(得分:1)

我有一个python解决方案pixelscan,它可以遍历各种空间模式中的像素,包括像你一样的方形环。基本思想是在8个基本方向之一中移动像素到像素,同时保持每个环的特定度量常数,在您的情况下,它是chebyshev度量。

答案 2 :(得分:0)

我解决了它类似于在螺旋上迭代矩阵。

这是Python,但理解JavaScript等价物是微不足道的。

def spiral(n):

  out = []
  for i in range(0, n):
    line = []
    out.append(line)
    for x in range(0, n):
      line.append(' ')

  x_start = 0
  y_start = 0
  x_stop = n
  y_stop = n

  while x_stop >= x_start:
    for x in range(x_start, x_stop):
      out[y_start][x] = '*'

    for y in range(y_start + 1, y_stop):
      out[y][x_stop - 1] = '*'

    y_start += 2

    for x in range(x_stop - 1, x_start, -1):
      out[y_stop - 1][x] = '*'

    y_stop -= 1
    x_start += 1

    for y in range(y_stop - 1, y_start - 1, -1):
      out[y][x_start] = '*'

    x_stop -=2
    y_stop -= 1
    x_start += 1

  for y in range(0, n):
    print(''.join(out[y]))

See it