将字符串映射到二维数组以获得 "zig-zag" 效果
Mapping a string into a 2D Array for a "zig-zag" effect
第一个 post,刚接触 js 编码。我正在尝试创建一个将 (2) 字符串数组作为输入的函数,例如 ["coderbyte", "3"],第一个字符串是任何随机字符串。第二个字符串表示函数应在二维数组中创建的行数。然后该函数应以锯齿形模式打印第一个字符串,如下所示:
c r e
o e b t
d y
然后该函数应该 return 在遍历每一行时通过组合字符形成的单词,例如“creoebtdy”。我已经声明了空数组并使用 while 循环,设法使用以下代码将前三个字符放在数组中的正确位置:
//initialize array of arrays of empty spaces
rows = Number(strArr[1])
columns = strArr[0].length
//console.log(rows)
//console.log(columns)
a = Array(rows).fill('').map(x => Array(columns).fill(''))
let i = 0
//a[0][0]= strArr[0][0]
while (i <= rows-1) {
a[i][i]= strArr[0][i]
//console.log(a)
i++
}
//console.log(a)
//let j = i - 2
//console.log(i)
while (i >= rows && i < rows*2) {
let j = i - 2
a[j][i] = strArr[0][i]
i++
j--
}
console.log(a)
}
stringChal3(["coderbyte", "3"])
当我尝试放置“e”和“ r”在数组中。我不确定如何修复错误。非常感谢所有帮助!
因为“非常感谢所有帮助”,这里有一个完全不同的方法来实现 zig-zag 效果。
它来自于注意到之字形图案使用顶行和底行中的每 4 个字符,但在不同的 offsets/phases(顶行为 0,底行为 2)和中间row 使用每 2 个字符(从偏移量 1 开始)。
const zigzag = str => {
const zig = (period, phase) => [...str]
.map((character, index) => (index % period == phase) ? character : ' ')
.join('');
console.log(zig(4, 0));
console.log(zig(2, 1));
console.log(zig(4, 2));
}
zigzag('coderbyte');
支持任意行数的版本
const zigzag = (str, rows) => {
const zig = (period, phase) => [...str]
.map((character, index) => [phase, period - phase].includes(index % period) ? character : ' ')
.join('');
for (let row = 0; row < rows; ++row) {
console.log(zig(rows + rows - 2 || 1, row));
}
}
zigzag('coderbyte', 3);
console.log('another example:');
zigzag('abcdefghijklmnopqrstuvwxyz', 5);
第一个 post,刚接触 js 编码。我正在尝试创建一个将 (2) 字符串数组作为输入的函数,例如 ["coderbyte", "3"],第一个字符串是任何随机字符串。第二个字符串表示函数应在二维数组中创建的行数。然后该函数应以锯齿形模式打印第一个字符串,如下所示:
c r e o e b t d y
然后该函数应该 return 在遍历每一行时通过组合字符形成的单词,例如“creoebtdy”。我已经声明了空数组并使用 while 循环,设法使用以下代码将前三个字符放在数组中的正确位置:
//initialize array of arrays of empty spaces
rows = Number(strArr[1])
columns = strArr[0].length
//console.log(rows)
//console.log(columns)
a = Array(rows).fill('').map(x => Array(columns).fill(''))
let i = 0
//a[0][0]= strArr[0][0]
while (i <= rows-1) {
a[i][i]= strArr[0][i]
//console.log(a)
i++
}
//console.log(a)
//let j = i - 2
//console.log(i)
while (i >= rows && i < rows*2) {
let j = i - 2
a[j][i] = strArr[0][i]
i++
j--
}
console.log(a)
}
stringChal3(["coderbyte", "3"])
当我尝试放置“e”和“ r”在数组中。我不确定如何修复错误。非常感谢所有帮助!
因为“非常感谢所有帮助”,这里有一个完全不同的方法来实现 zig-zag 效果。
它来自于注意到之字形图案使用顶行和底行中的每 4 个字符,但在不同的 offsets/phases(顶行为 0,底行为 2)和中间row 使用每 2 个字符(从偏移量 1 开始)。
const zigzag = str => {
const zig = (period, phase) => [...str]
.map((character, index) => (index % period == phase) ? character : ' ')
.join('');
console.log(zig(4, 0));
console.log(zig(2, 1));
console.log(zig(4, 2));
}
zigzag('coderbyte');
支持任意行数的版本
const zigzag = (str, rows) => {
const zig = (period, phase) => [...str]
.map((character, index) => [phase, period - phase].includes(index % period) ? character : ' ')
.join('');
for (let row = 0; row < rows; ++row) {
console.log(zig(rows + rows - 2 || 1, row));
}
}
zigzag('coderbyte', 3);
console.log('another example:');
zigzag('abcdefghijklmnopqrstuvwxyz', 5);