如何处理 Caesars Cipher 中的负偏移 (Javascript)
How to process negative shifts in Caesars Cipher (Javascript)
我正在尝试通过 Odin Projects Caesars Cipher,测试要求能够转换负偏移。根据我当前的代码,我可以转换小写字母,但我在使用 B 或 W 时遇到了一些问题。
it('works with negative shift', function() {
expect(caesar('Mjqqt, Btwqi!', -5)).toEqual('Hello, World!');
然而在 return 我的代码吐出
'Hello, =orld!'
太近了!我一直在试图弄清楚它是什么,但我不确定我在这里做错了什么,因为 'H' 正在工作
我已经多次重写这个东西,我总是在这里结束。我确定这只是一个数字之类的。然而,这超出了我目前所知道或能够理解的范围。
提前谢谢大家,很抱歉回答这么简单的问题。
const caesar = function(message, shift) {
return message
.split("") //splits it into an array
.map(message => { //does the following to each element in the array
normalStr = String.fromCharCode(message.charCodeAt())
prePoint = message.charCodeAt() //gets the charcode of element
//if/else checks to see if upper or lower case
if (prePoint >= 65 && prePoint <= 90) { //upper case
return String.fromCharCode(((prePoint - 65 + shift) % 26) + 65);
} else if (prePoint >= 97 && prePoint <= 122){ //lower case
return String.fromCharCode((prePoint -97 + shift % 26) + 97)
} else {
return normalStr
//1 func proc uppoer case
//1 func proc lowercase
//1 func proc non upper/lower case
}})
.join("")
}
您的代码仅适用于正凯撒变换,因为在
String.fromCharCode(((prePoint - 65 + shift) % 26) + 65);
prePoint - 65 + shift
可能低于零(使用 prePoint = B
= 66 和 shift = -5
你会得到 -4
)
您可以通过检查 (prePoint - 65 + shift)
的结果是否为负数来解决此问题,如果是,则向其添加 26:
let newPoint = (prePoint - 65 + shift) % 26;
if(newPoint < 0) newPoint += 26;
return String.fromCharCode(newPoint + 65);
(小写字母同理)
或者,您可以在函数开始时将负位移转换为正位移(-5 凯撒位移与 21 凯撒位移相同):
if(shift < 0) { shift = 26 + (shift % 26);}
完整示例:
function caesar(message, shift) {
if (shift < 0) {
shift = 26 + (shift % 26);
}
return message
.split("") //splits it into an array
.map(message => { //does the following to each element in the array
normalStr = String.fromCharCode(message.charCodeAt())
prePoint = message.charCodeAt() //gets the charcode of element
//if/else checks to see if upper or lower case
if (prePoint >= 65 && prePoint <= 90) { //upper case
return String.fromCharCode(((prePoint - 65 + shift) % 26) + 65);
} else if (prePoint >= 97 && prePoint <= 122) { //lower case
return String.fromCharCode(((prePoint - 97 + shift) % 26) + 97)
} else {
return normalStr;
}
})
.join("");
}
console.log(caesar('Mjqqt, Btwqi!', -5)); // Hello World!
我正在尝试通过 Odin Projects Caesars Cipher,测试要求能够转换负偏移。根据我当前的代码,我可以转换小写字母,但我在使用 B 或 W 时遇到了一些问题。
it('works with negative shift', function() {
expect(caesar('Mjqqt, Btwqi!', -5)).toEqual('Hello, World!');
然而在 return 我的代码吐出
'Hello, =orld!'
太近了!我一直在试图弄清楚它是什么,但我不确定我在这里做错了什么,因为 'H' 正在工作
我已经多次重写这个东西,我总是在这里结束。我确定这只是一个数字之类的。然而,这超出了我目前所知道或能够理解的范围。
提前谢谢大家,很抱歉回答这么简单的问题。
const caesar = function(message, shift) {
return message
.split("") //splits it into an array
.map(message => { //does the following to each element in the array
normalStr = String.fromCharCode(message.charCodeAt())
prePoint = message.charCodeAt() //gets the charcode of element
//if/else checks to see if upper or lower case
if (prePoint >= 65 && prePoint <= 90) { //upper case
return String.fromCharCode(((prePoint - 65 + shift) % 26) + 65);
} else if (prePoint >= 97 && prePoint <= 122){ //lower case
return String.fromCharCode((prePoint -97 + shift % 26) + 97)
} else {
return normalStr
//1 func proc uppoer case
//1 func proc lowercase
//1 func proc non upper/lower case
}})
.join("")
}
您的代码仅适用于正凯撒变换,因为在
String.fromCharCode(((prePoint - 65 + shift) % 26) + 65);
prePoint - 65 + shift
可能低于零(使用 prePoint = B
= 66 和 shift = -5
你会得到 -4
)
您可以通过检查 (prePoint - 65 + shift)
的结果是否为负数来解决此问题,如果是,则向其添加 26:
let newPoint = (prePoint - 65 + shift) % 26;
if(newPoint < 0) newPoint += 26;
return String.fromCharCode(newPoint + 65);
(小写字母同理)
或者,您可以在函数开始时将负位移转换为正位移(-5 凯撒位移与 21 凯撒位移相同):
if(shift < 0) { shift = 26 + (shift % 26);}
完整示例:
function caesar(message, shift) {
if (shift < 0) {
shift = 26 + (shift % 26);
}
return message
.split("") //splits it into an array
.map(message => { //does the following to each element in the array
normalStr = String.fromCharCode(message.charCodeAt())
prePoint = message.charCodeAt() //gets the charcode of element
//if/else checks to see if upper or lower case
if (prePoint >= 65 && prePoint <= 90) { //upper case
return String.fromCharCode(((prePoint - 65 + shift) % 26) + 65);
} else if (prePoint >= 97 && prePoint <= 122) { //lower case
return String.fromCharCode(((prePoint - 97 + shift) % 26) + 97)
} else {
return normalStr;
}
})
.join("");
}
console.log(caesar('Mjqqt, Btwqi!', -5)); // Hello World!