2016-10-30 38 views
0

私はfreecodecampアルゴリズムのチャレンジ "Caesars Cipher"をやっています。私は自分のコードに問題があります。ルックアップテーブルを動的オブジェクトとして生成しようとしましたが、なんらかの理由で登録されませんでした。 console.logを実行しているときは、 "lookup table is undefined"と表示されます。これはAcode変数と同じです。 console.logsをコメントアウトすると動作しますが、strArrのcharがlookupTableに存在するかどうかを調べる以下の部分があるため、何も暗号化しません。そうでなければ、encryptedArrに同じ値を割り当てる必要があります(これはコンマ、スペースなどを暗号化しないようにする):JavaScript動的に作成されたオブジェクトは定義されていません

strArr.forEach(function(thisArg) { 
    var newValue; 

    if(lookupTable[thisArg] !== undefined) { 
     newValue = lookupTable[thisArg]; 
    } else { 
     newValue = thisArg; 
    } 

    encryptedArr.push(newValue); 

}); 

もちろんルックアップテーブル[thisArg]は常に定義されていません。ここ は、同様に上記の部分と全体の関数である。

function rot13(str) { // LBH QVQ VG! 
 

 
    var strArr; 
 
    var encryptedArr = []; 
 
    var Acode; 
 
    var lookupTable = {}; //this object will contain the mapping of letters 
 
    var encryptedString; 
 

 
    //check the code of A , this will be a reference for the first letter as the algorith will use Modular Arithmetic 
 
    Acode = 'A'.charCodeAt(0); 
 
    console.log(Acode); 
 
    //generate an object containing mappings (I din't want to do it initially but theoreticaly just making lookups in a table would be more efficiant for huge workloads than calculating it every time) 
 
    //this algorithm is a little bit complecated but i don't know how to do modular arithmetic in code properly so I use workarrounds. If a = 101 then I do 101 + the remainder from current letter((Acode + 1) - 13) divided by 26 which works 
 

 
    for (i = 0; i < 26; i++) { 
 
    lookupTable[String.fromCharCode(Acode + i)] = String.fromCharCode(Acode + ((Acode + i) - 13) % 26); 
 
    console.log(lookupTable[String.fromCharCode(Acode + i)]); 
 
    } 
 

 
    //save the string into the array 
 
    strArr = str.split(""); 
 

 
    //change letters into numbers and save into the code array 
 
    strArr.forEach(function(thisArg) { 
 
    var newValue; 
 

 
    if (lookupTable[thisArg] !== undefined) { 
 
     newValue = lookupTable[thisArg]; 
 
    } else { 
 
     newValue = thisArg; 
 
    } 
 

 
    encryptedArr.push(newValue); 
 

 
    }); 
 

 

 
    encryptedString = encryptedArr.join(""); 
 

 

 
    return encryptedString; 
 
} 
 

 
// Change the inputs below to test 
 
rot13("SERR PBQR PNZC"); 
 
console.log(Acode);

私はルックアップテーブルオブジェクトの作成と以下と間違って何をしているのですか?

Acode = 'A'.charCodeAt(0); 
+0

'ACODE +((ACODE I +)-13)%26'があることによってそれをシフトした後に、アルファベットの先頭からのオフセットへの弾性係数を適用したいです違う。 'Acode +((i + 13)%26)' – Barmar

+0

'console.log(lookupTable)'を試しましたか? – Barmar

+0

'console.log(strArr)'を実行できますか?その配列の内容が予想よりも異なる可能性があります。 – DBWhite

答えて

1

未定義の変数はありません。あなたのコードの問題は、ルックアップテーブルのエントリを計算する方法です。あなたのコードは、正しい式が

Acode + ((i + 13) % 26) 

Acodeである13でシフトしていない、それ自体にすべての文字をマッピングされた文字のASCIIコードで、あなたはモジュール式のシフトを実行するときにすることを含むべきではありません。あなただけの13

function rot13(str) { // LBH QVQ VG! 
 

 
    var strArr; 
 
    var encryptedArr = []; 
 
    var Acode; 
 
    var lookupTable = {}; //this object will contain the mapping of letters 
 
    var encryptedString; 
 

 
    //check the code of A , this will be a reference for the first letter as the algorith will use Modular Arithmetic 
 
    Acode = 'A'.charCodeAt(0); 
 
    // console.log(Acode); 
 
    //generate an object containing mappings (I din't want to do it initially but theoreticaly just making lookups in a table would be more efficiant for huge workloads than calculating it every time) 
 
    //this algorithm is a little bit complecated but i don't know how to do modular arithmetic in code properly so I use workarrounds. If a = 101 then I do 101 + the remainder from current letter((Acode + 1) - 13) divided by 26 which works 
 

 
    for (i = 0; i < 26; i++) { 
 
    lookupTable[String.fromCharCode(Acode + i)] = String.fromCharCode(Acode + ((i + 13) % 26)); 
 
    // console.log(lookupTable[String.fromCharCode(Acode + i)]); 
 
    } 
 

 
    //save the string into the array 
 
    strArr = str.split(""); 
 

 
    //change letters into numbers and save into the code array 
 
    strArr.forEach(function(thisArg) { 
 
    var newValue; 
 

 
    if (lookupTable[thisArg] !== undefined) { 
 
     newValue = lookupTable[thisArg]; 
 
    } else { 
 
     newValue = thisArg; 
 
    } 
 

 
    encryptedArr.push(newValue); 
 

 
    }); 
 

 

 
    encryptedString = encryptedArr.join(""); 
 

 

 
    return encryptedString; 
 
} 
 

 
// Change the inputs below to test 
 
var result = rot13("SERR PBQR PNZC"); 
 
console.log(result);

+0

これは間違ってマッピングされているため何かにマップされているため、さて、私はCeasars Cipherが3文字のアルゴートを引くことによって誤解されました。ありがとうございます。適切な解決策を提示してくれてありがとうございます:) –

+0

私が見た唯一の「未定義」は 'console。'Acode'は関数内でのみ定義されているため、関数の外側にlog(Acode)があります。 – Barmar

関連する問題