Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何以垂直反转模式洗牌角色?_Javascript_Arrays_String_Jagged Arrays - Fatal编程技术网

Javascript 如何以垂直反转模式洗牌角色?

Javascript 如何以垂直反转模式洗牌角色?,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)使事情变得

我有一个字符串“ABCDEFGHIJKLMN”,我需要以一种特定的方式来洗牌。要做到这一点,我在列底部->顶部,然后左->右(例如每列4个字符)中顺序写入字符,直到完成所有字符。如果最后一列不完整,则需要在底部留出空白(这非常重要)。像这样:

D H L N
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
放在最后两行而不是前两行?