首页 > 解决方案 > JavaScript 行转置密码 - 如何将键转换为列号

问题描述

我在将密钥中的字母转换为行转置密码中的字母顺序时遇到了一些麻烦。

例如,如果我们将单词“fruit”作为我们的键,它应该转换为以下数字序列:“ 6(f) 18(r) 21(u) 9(i) 20(t)

我设法使用此功能实现了这一点:

function filterKey(key) {
    var result = [];
    for (var i = 0; i < key.length; i++) {
        var c = key.charCodeAt(i);
        result.push((c - 65) % 32);
    }
    return result;
}

我的问题是:如何将上述数字序列转换为列号?

像这样:“6(f)18(r)21(u)9(i)20(t)” -> “1(f)3(r)5(u)2(i)4(t)”

标签: javascriptalgorithmencryption

解决方案


我不知道你是想在函数内部还是在返回结果之后这样做。

无论哪种方式,以下应该可以完成这项工作:

var key = "fruit";
var result = key.split("").map(function(x) {return (x.charCodeAt(0) - 65) % 32}); // (one-liner for your function)
var sorted = result.slice(0).sort(function(a, b) {return a - b});
var columnNumbers = result.map(function(x) {
    var index = sorted.indexOf(x);
    sorted[index] = 0; // reset value in case of duplicate chars
    return index + 1;
});
console.log(columnNumbers);

请注意,这旨在处理密钥中的重复字母。

例如"froot"将输出[1, 4, 2, 3, 5]


推荐阅读