私は皇帝の暗号列を解読可能なテキストにデコードするkataをやっています。特殊文字を見つけてスキップするためにマップ内でRegExを使用していますが、2つ以上の特殊文字が隣にある場合は出力が不安定です( '、'、 ':)。いくつかの特殊文字を飛ばしているようだ。地図と正規の奇妙さ
誰でも何が起こっているのか説明できますか?
changeCharCode関数コードが含まれていないのは、問題がマップにあると思うからです。
function decodeString(string) {
const stringArr = string.toLowerCase().split('');
const specialCharacters = /[ .,\/#!$%\^&\*;:{}=\-_`~()]/g;
const codeOfX = 'x'.charCodeAt(0);
const codeOfLastLetter = stringArr[stringArr.length - 1].charCodeAt(0);
const codeShift = codeOfX - codeOfLastLetter;
return stringArr.map((elem) => {
// Special character treatment
return specialCharacters.test(elem) === true ? elem : changecharCode(elem, codeShift);
}).join('').toUpperCase();
}
function changecharCode (letter, codeShift) {
const currentCode = letter.charCodeAt(0);
// Uppercase letters
if ((currentCode >= 65) && (currentCode <= 90))
return letter = String.fromCharCode(((currentCode - 65 + codeShift) % 26) + 65);
// Lowercase letters
else if ((currentCode >= 97) && (currentCode <= 122))
return letter = String.fromCharCode(((currentCode - 97 + codeShift) % 26) + 97);
}
decodeString(' :) ') => ') '
decodeString(', ') => ','
'specialCharacters.test'はあなたが提供した各文字に対してtrueになります2つの呼び出しでは、デバッグで簡単に確認できます。 *「スキップオーバー」*とはどういう意味ですか? 'changecharCode'関数を使わないと出力をテストすることはできません。あなたはそれを提供できますか? – trincot
changecharCodeのコードを追加しました。 'スキップオーバー'によって、マップが特殊文字の場合はマップが要素を返すことが期待されます。そのため、マップされた配列に結合するとき、特殊文字は同じ場所にあります。私はまた、changecharCode関数で特殊文字を処理したくありません。 はい、正しいですが、各出力のテスト呼び出しはtrueを返しますが、出力からわかるように、マップの結果には特殊文字である要素のすべてが含まれているわけではありません。 – user6456392
実際、あなたのエラーはその機能にあることが判明しました。私の答えを見てください。 – trincot