Javascript 如何以垂直反转模式洗牌角色?
我有一个字符串“ABCDEFGHIJKLMN”,我需要以一种特定的方式来洗牌。要做到这一点,我在列底部->顶部,然后左->右(例如每列4个字符)中顺序写入字符,直到完成所有字符。如果最后一列不完整,则需要在底部留出空白(这非常重要)。像这样: D H L NJavascript 如何以垂直反转模式洗牌角色?,javascript,arrays,string,jagged-arrays,Javascript,Arrays,String,Jagged Arrays,我有一个字符串“ABCDEFGHIJKLMN”,我需要以一种特定的方式来洗牌。要做到这一点,我在列底部->顶部,然后左->右(例如每列4个字符)中顺序写入字符,直到完成所有字符。如果最后一列不完整,则需要在底部留出空白(这非常重要)。像这样: D H L N C G K M B F J A E I 洗牌是通过生成一个新字符串来完成的,在我们阅读文本时,在左->右行中读取字母块: “DHLNCGKMBFJAEI” 列不完整的情况(word.size%column\u height!=0)使事情变得
C G K M
B F J
A E I 洗牌是通过生成一个新字符串来完成的,在我们阅读文本时,在左->右行中读取字母块: “DHLNCGKMBFJAEI” 列不完整的情况(word.size%column\u height!=0)使事情变得相当复杂 我提出了一些解决方案,但我不确定是否有一种更简单(即,更短或更容易阅读)和更优雅的方法来编码这个问题。我的解决方案要么有一个丑陋的、单独的代码块来处理最后一个不完整的列,要么看起来太复杂了 我的问题是,能做得更好吗 如果你不想要任何破坏者,并决定尝试自己解决它,现在停止阅读。如果您想从我到目前为止所做的工作开始,那么需要一段工作代码
var结果=”;
var str=“ABCDEFGHIJKLMN”;
变量nr_行=4;
无功电流_行=4;
变量列=数学楼层(str.length/nr_行);
var模数表=str.length%nr\u行;
var模数_位置=-1;
对于(变量i=0;i0){
结果+=str[str.长度+模数_位置];
模数表--;
模_位置--;
}
当前_行--;
}
控制台日志(结果)代码>如果正确解释问题,您可以使用for
循环,String.prototype.slice()
用字符串字符填充数组。在递归函数中使用Array.prototype.pop()
获取数组的最后一个元素,直到每个数组.length
为0
创建数组的步骤
[
["D","H","L","N"],
["C","G","K","M"],
["B","F","J"],
["A","E","I"]
]
从垂直反转的字符串中,您可以使用for
循环,string.prototype.slice()
来设置包含长度4
元素的数组,或3
一次。父数组的长度为2
,已设置为包含四个元素的两个数组
var str=“ABCDEFGHIJKLMN”;
功能fnVerticalInvert(str、arr、res){
如果(!arr&&!res){
arr=[];res=“”;
}
如果(str){
对于(变量i=0;i 控制台日志(res)代码>如果希望返回字符串,我不明白为什么任何中间结果都不必使用数组。下面的代码可以少用一个数组,但是使用split和数组来控制while循环比较方便,而不是改变字符串
其思想是从下到上填充字符串,直到列已满,然后继续从每列的底部添加,直到没有要分配的字符为止。开始填充的行基于剩余字符数和行数
它可以构建数组,而不是构建字符串,但是生成字符串需要多个联接
它还可以在所有字符的插槽不足的情况下生成结果,因此使用3x3“矩阵”使用10个或更多字符中的9个字符生成结果(参见最后一个示例)
函数垂直洗牌(s、行、列){
var结果=[''];
s=s.分割(“”);
while(s.length&&result[0]。长度=0;i--){
如果(!result[i])result[i]='';
结果[i]+=s.splice(0,1)[0]| |“”;
}
}
返回结果。join(“”);
}
var s='ABCDEFGHIJKLMN';
console.log(垂直洗牌(s,4,4));//DHLNCGKMBFJAEI
console.log(垂直洗牌(s,6,3));//FLNEKMDJCIBHAG
//仅使用9个字符
console.log(垂直洗牌(s,3,3));//CFIBEHADG
如果将数组拆分/反转为列组,然后转换为行,会怎么样
const result = str.match(/.{1,4}/g) // split string into groups of 4
.map(i => i.split('').reverse()) // reverse each group (bottom to top, and solves the last col issue)
.reduce((res, col) => { // reduce the groups into rows
col.forEach((c, i) => res[i] += c) // concat each string char to the right row
return res
}, ['','','','']) // initialise empty strings per row
.join('') // join the rows up
Fiddle“如果最后一行不完整…”应为“如果最后一列…”。不确定是什么问题?更易于阅读(可以使用标准库和表达式):将操作拆分为多个标准矩阵操作。1.将字符串重塑为4xn矩阵,2。转置矩阵,3。水平镜像/翻转矩阵,4。移动最后一列,5。将矩阵重塑为1x(mxn)字符串。“如果最后一行不完整…”应为“如果最后一列…”已修复,THX不确定您的确切要求是什么,但如果您希望将字符从下到上排列,则不应将M
和N
放在最后两行而不是前两行?