【问题标题】:Big Bang Theory Challenge生活大爆炸理论挑战
【发布时间】:2020-05-27 04:14:51
【问题描述】:

在我今天看的大爆炸剧集中(第 11 季第 20 集),疯狂的工作理论宇宙学家 Wolcott 博士将他的笔记倒写,并将所有字母改为数字,这让 Sheldon 很难读。我认为这对我来说是一个很好的挑战,因为我是编程新手。

我能够创建一个可以将单词加密为数字的函数,以便 Sheldon 可以与 Wolcott 博士交流,但我无法将这些数字解密为文字,以便 Wolcott 博士与 Sheldon 交流。

我遇到的主要问题是将两位数转换为字母。

例如,encrypt('z') 将返回 25,即该字母的索引,但 decrypt('25') 将返回 'fc' 而不是 'z'

我在重构和选择好的变量名时遇到了困难,很抱歉。也感谢您的帮助,我非常感谢。

const alphabet = 'abcdefghijklmnopqrstuvwxyz';
const alphabetArray = alphabet.split('');


const encrypt = (sentence) => {
    const sentenceArray = sentence.toLowerCase().split('').reverse();

    const encryption = [];

    for (let i = 0; i < sentenceArray.length; i += 1) {
        if (sentenceArray[i] === ' ') {
            encryption.push(' ');
        }
        for (let j = 0; j < alphabetArray.length; j += 1) {
            if (sentenceArray[i] === alphabetArray[j]) {
                const letterIndex = alphabetArray.indexOf(alphabetArray[j]);
                encryption.push(letterIndex);
            }
        }
    }
    return encryption.join('');
};

encrypt('Abc Def');



const decrypt = (numbers) => {
    const numbersArray = numbers.split('').reverse();

    const decryption = [];

    for (let i = 0; i < numbersArray.length; i += 1) {
        if (numbersArray[i] === ' ') {
            decryption.push(' ');
        }
        for (let j = 0; j < alphabetArray.length; j += 1) {
            if (parseInt(numbersArray[i]) === alphabetArray.indexOf(alphabetArray[j])) {
                decryption.push(alphabetArray[j]);
            }
        }
    }
    return decryption.join('');
};

decrypt('543 210');

【问题讨论】:

  • 您应该进行以下更改,而不是使用 A 的值作为 1,您应该使用 01、2 作为 02、3 03 ... 并使用 0 作为 00。通过使用这种形式,每个字母都将在两位数的形式,你可以很容易地分开。
  • 您没有为程序提供区分解密“fc”或“z”的方法。换句话说,应该有某种分隔符来告诉程序何时停止将条目解释为字母(例如逗号、空格或换行符)。 @SankalpBhamare 的建议效果很好。
  • 如果您不想使用此方法,您可以使用秘密分隔符,ASCII 符号 U+200C ,此符号是不可见的,但存在于字符串中,允许您分隔每个条目数组...所以你的字符串可以像 1|23|0| |20|37 这个'|'是一个不可见的字符,它是不可见的,但是当你迭代或复制字符串时它会起作用。
  • 这是一个有趣的问题,因为它突出了 utf-8 编码的原则:每个 ASCII 字符将使用单个字节(仅使用低 7 位)进行编码。扩展字符集的成员以更长的字节序列编码。这些由第一个字节“宣布”(例如,设置最高位并指定要跟随多少字节)。因此,您需要有一个类似的算法,您可以通过该算法确定您查看的是一位数还是两位数。

标签: javascript encryption translation


【解决方案1】:

作为我上面评论的后续,下面的代码应该可以工作。

const alphabet = 'abcdefghijklmnopqrstuvwxyz';
const alphabetArray = alphabet.split('');


const encrypt = (sentence) => {
    const sentenceArray = sentence.toLowerCase().split('').reverse();

    const encryption = [];

    for (let i = 0; i < sentenceArray.length; i += 1) {
        if (sentenceArray[i] === ' ') {
            encryption.push(' ');
        }
        else {
            const letterIndex = alphabetArray.indexOf(sentenceArray[i]);
            if (letterIndex < 10)
                encryption.push('0' + letterIndex);
            else
                encryption.push(letterIndex);
        }
    }
    return encryption.join('');
};

e = encrypt('abc Def');
console.log(e);

const decrypt = (numbers) => {
    const decryption = [];
    
    const numSegments = numbers.split(' ');
    for (let i = 0; i < numSegments.length; i += 1) {
        numSegment = numSegments[i];
        for (let j = 0; j < numSegment.length; j += 2){
            alphabetPosition = parseInt(numSegment.substring(j, j+2));
            decryption.push(alphabet[alphabetPosition]);
        }
        if (i < numSegments.length - 1) {
            decryption.push(' ');
        }
    }

    return decryption.reverse().join('');
};

d = decrypt('050403 020100');
console.log(d);

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多