在javascript中打印2d数组

时间:2015-11-18 04:37:31

标签: javascript

rail

如上图所示,在使用Javascript时,如果使用单词defendtheeastwallofthecastle,如何创建四行单独的文本?

1 个答案:

答案 0 :(得分:2)

数学解决方案

仔细看看你的输出:

a.....g.....m.....s.
.b...f.h...l.n...r.t
..c.e...i.k...o.q...
...d.....j.....p....

请注意,它可以拆分为类似的重复块:

a.....    g.....    m.....    s.
.b...f    .h...l    .n...r    .t
..c.e.    ..i.k.    ..o.q.    ..
...d..    ...j..    ...p..    ..

这个块的长度是可以计算的:每一行,除了第一行和最后一行,都有2个字母。总长度为:rows * 2 - 2。我们称之为blockLength。顺便说一句,x * 2 - 2总是平均的 - 这很重要。

现在,您可以看到,在每个区块中,字母在左半部分“下沉”,并在第二个中出现。所以,如果你进行一些观察和分析,你就会明白,对于blockLength == 6你需要在i输出字母:

 row  |  i % blockLength
----------------------------
  0   |         0
  1   |  1, blockLength - 1
  2   |  2, blockLength - 2
  3   |         3

i超过blockLength后,它会一次又一次地重复,直到字符串结束。如果您了解它的基础知识,这种规律性可以很容易地转换为JavaScript循环。

懒惰解决方案

在循环中设置Zig-zag顺序的值:

var str = 'abcdefghijklmopqrst';
var rows = 4, letterRows = [], currentRow = 0, direction = 1;

for (var i = 0; i < str.length; i++)
{
    letterRows.push(currentRow);
    currentRow += direction;

    if ((direction === 1 && currentRow == rows - 1) // bottom limit
     || (direction === -1 && currentRow == 0)) // top limit 
    {
       direction = direction * -1; // invert direction                                 
    }
}

然后,在嵌套循环中,只需根据letterRows输出您的字母:

for (var row = 0; row < rows; row++)
{
    for (var i = 0; i < str.length; i++)
    {
        output(letterRows[i] == row ? str[i] : '.'); // output is any possible output in your case
    }
    output('\n');
}