首页 > 解决方案 > JavaScript 字符串加密

问题描述

我想使用以下加密方案加密一行文本。

这是样本输入。首先,从文本中删除空格。

haveaniceday

然后,返回字符串的长度(L = 12)。接下来,将字符写入网格,其行和列具有以下约束:

L字符串的长度将返回is between3和的平方根4。因此,改写为 3 行 4 列:

have
anic
eday

最后,通过显示一列中的字符,插入一个空格,然后显示下一列并插入一个空格,等等来获得编码的消息。

例如,上述矩形的编码消息是:

hae and via ecy

在我的代码片段中,网格["have", "anic", "eday"]已经创建,但我不知道如何实现下一阶段。

const s = "haveaniceday";
let result = encryption(s);

function encryption(s) {

  let sqr = Math.sqrt(s.length),
    col = Math.ceil(sqr),
    row = Math.floor(sqr);

  let chunks = chunkSubstr(s, col);
  // => ["have", "anic", "eday"]
  console.log(chunks);

  for (var i = 0; i < chunks.length; i++) {
    // do some magic here...      
    // expected output: "hae and via ecy"
  }

}


function chunkSubstr(str, size) {
  const numChunks = Math.ceil(str.length / size)
  const chunks = new Array(numChunks)

  for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
    chunks[i] = str.substr(o, size)
  }

  return chunks
}

标签: javascriptarraysstringalgorithmecmascript-6

解决方案


您可以在另一个数组中减少您的数组["have" "anic" "eday"],即字符串的长度。对于原始数组的每三个成员,您将其所有字符映射到新数组中。

const original = ["have", "anic", "eday"];
const output = original.reduce((out, word) => {
 word.split("") // break into characters[]
  .forEach((char, i) =>
    out[i] += char // append this char to the corresponding string of `out`
  );
 return out;
}, new Array(original[0].length).fill('')) // ['', '', '', '']
console.log(output.join(' '));


推荐阅读