我是javascript的新手,这是Basic Algorithm Scripting.I的最后一门课程。我正在尝试理解这行代码,因为我从免费代码阵营获得了前端开发证书的下一部分,我想了解一切。我一直在寻找解决方案,并找到了这个。我理解评论上的一些行,但我有一个很难理解的公式,这个代码100%工作,但我只需要一些进一步的理解。代码如下:
function rot13(str) {
//retCharArray is an Array of character codes for the solution
var rotCharArray = [];
//regular expression for all upper case letter from A to Z
var regEx = /[A-Z]/;
//split str into a character array
str = str.split("");
for (var x in str) { //iterate over each character in the array
//regEx.test(str[x]) will return (true or false) if it maches the regEx or not
if (regEx.test(str[x])) {
// A more general approach
// possible because of modular arithmetic
// and cyclic nature of rot13 transform
// I DON'T CLEARLY UNDERSTAND THIS CODE BELOW
rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);
} else {
rotCharArray.push(str[x].charCodeAt());
}
}
//make a string with character codes from an array of character codes
str = String.fromCharCode.apply(String, rotCharArray);
return str;
}
// Change the inputs below to test
rot13("SDASasd");
发布于 2016-05-01 17:22:09
上面的两个答案在这里回答了你的问题的一半,但他们并没有真正看到你的问题,那就是为了回答自由代码营挑战,你必须离开并理解caesar密码和ROT13算法背后的数学原理。我对此也有问题。
让我们一起来看一下,然后一步一步地复习一下。(我不理解不是每个人在高中都学过这个--我没有!):
// I DON'T CLEARLY UNDERSTAND THIS CODE BELOW
rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);
} else {
rotCharArray.push(str[x].charCodeAt());
}@basos.sergio和@caulitomaz的答案都有帮助,但它们只解释了部分原因,并没有为您提供进一步的研究:
@basos.sergio的
“获取26的模数(这可确保编码不会加密到'Z‘字母以上的任何内容,例如'Z’字母将转换为(90-65+13) % 26 + 65) = 77 'M‘字母。本质上,它将使加密算法循环到开头。”
@caulitomaz's
在英文字母表中有26个字符。这就是为什么应用13的循环旋转,然后应用模运算的原因。
他们在这里都指的是“模算术”:
模算术表明,一些数字是“同余”的,即当对它们应用模运算时,它们共享相同的余数。
例如,2%12,14%12,26%12=余数2。这样,当你的数字必须出现在一个范围内,或者一个设备只显示一个范围内的数字时,你就可以计算出那个数字“循环回来”的位置。
请注意,在我的示例中,使用了% 12 -这是12小时时钟可以显示的总小时数。所以如果是凌晨2点,我想知道12小时后的时间,我会加上12,但是我的时钟不能显示14:00 (不是12小时模式)。模12给了我实时的时间。
例如:现在是凌晨4点我的飞机延误了29个小时(这是一家糟糕的航空公司)。如何计算新的起飞时间?4+ 29 % 12 =上午9点(如果延迟小于24,我需要交换am/pm,但您应该了解情况。)
ROT13
这里我们有一个使用ROT 13的旋转密码的特殊情况,其中应用两次密码将得到要编码的原始字符,因为字母表只有26个字符,而13恰好是26的一半。
x= ROT13(ROT13(x))
因此,实际上,我们不需要担心在应用或反转加密时添加13或减去13,我们只需再次应用它来获得原始加密。
那么,算法是如何工作的呢
(strx.charCodeAt() - 65 +13)
(strx.charCodeAt() - 65 + 13) %26
(strx.charCodeAt() - 65 + 13) % 26 + 65)
工作示例:
ROT13(X)
'X'.charCodeAt(0) = 88
- 65 = 23
+ 13 = 36
%26 = 10
+65 = 75
charCodeFrom(75) = KROT13(K)
'K'.charCodateAt(0) = 75
- 65 = 10
+ 13 = 23
%26 = 23
+65 = 88
charCodeFrom(88) = X来源:
http://betterexplained.com/articles/fun-with-modular-arithmetic/ https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic
发布于 2016-04-30 00:28:25
由于您仅使用大写字符,因此您需要了解您正在使用的字符代码范围。大写字母'A‘对应于65。
'A'.charCodeAt(0)返回65
您的最大值是'Z',它对应于90。
在英文字母表中有26个字符。这就是为什么应用13的循环旋转,然后应用模运算的原因。
要检索正确的charCode,需要在结果中再次添加65。
rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);
发布于 2016-04-30 00:45:07
第一。代码只转换的大写字母(请看下面的ascii表)
(str[x].charCodeAt() - 65 + 13) % 26 + 65这就意味着,
(90-65+13) % 26 + 65) = 77 'M‘字母。本质上,它将使加密算法循环到beginning.

https://stackoverflow.com/questions/36942744
复制相似问题