2016-04-29 9 views
0

私はジャバスクリプトで新しいですし、これは基本的なアルゴリズムScripting.Iからの最後のコースである私は自由なコードのキャンプからフロントエンド開発証明書の次の部分に乗るようコードのこの行を理解しようとしています、私はeveythingを理解したいです。私は解決策を探していて、これを見つけました。私はコメントのいくつかの行を理解していますが、私は式で理解するのが苦労しています、このコードは100%働いていますが、私はちょっとした理解が必要です。ROT13 .charCodeAt()の暗号コード?

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");

答えて

1

だけ大文字を使用しているので、あなたはあなたが作業している文字コードの範囲を理解する必要があります。これは、コードです。大文字 'A' は65

'A'.charCodeAt(0)戻り65

に対応しており、あなたの最大値が90に対応して 'Z'、です。

英語のアルファベットには26文字あります。そのため、13のサイファー回転を適用してからモジュロ演算を適用するのはこのためです。

が正しいcharCodeはを取得するには、65の結果に再び追加されます。

rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);

0

最初。コードは

  1. CHARCODE番号を取得し、のみ大文字

    (str[x].charCodeAt() - 65 + 13) % 26 + 65 
    

    これはに変換(以下のASCIIテーブルで見て)に変換65

  2. を引く(それがあろう65〜90)
  3. (これはエンコーディングは、例えば「Z」の文字が(90-65+13) % 26 + 65) = 77「M」の文字に変換されます、「Z」の文字以上の何にも暗号化しないことが保証されます。Essentiall 26の剰余を取得する13
  4. を追加します。 yを指定すると、暗号化アルゴリズムが最初にループします。
  5. 上記の2つの答えがここにあなたの問題に答えるに半分の道を行くが、彼らは本当にそれがあなたに挑戦無料コードキャンプに答えることで、あなたの問題が表示されていないバック65

ASCII table

2

を追加します。外に出て、シーザーサイファーとROT13算術の背後にある数学を理解しなければなりません。私もこれに問題があった。

一緒に見て、それを段階的に見てみましょう。 (私は誰もが高校でこれを勉強し理解して - 私はしませんでした!):

// I DON'T CLEARLY UNDERSTAND THIS CODE BELOW 
    rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65); 
} else { 
    rotCharArray.push(str[x].charCodeAt()); 
} 

両方bastos.sergio年代と@のcaulitomazの答え@は助けるが、彼らは部分的にしか説明し、さらににあなたを指していません研究:

@bastos。セルジオさん

「26の剰余を取得します(これは、エンコーディングは、インスタンスのための 『Z』の文字以上のものに 暗号化、 『Z』の文字 )は+ 13 90から65(に変換されますないことが保証さ%26 + 65)= 77 'M' Letter。本質的には、 は暗号アルゴリズムを最初にループさせます。 caulitomazの

@

英語のアルファベットで26の文字があります。そのため、 を13のサイファー回転に適用し、モジュロ演算を適用するのはこのためです。

モジュラー演算」彼らは両方とも、ここを参照しています:

モジュラー算術は、いくつかの数字が 『合同』、それは彼らが同じ余りを共有していることを示しているとき、モジュロ演算それらに適用されます。

たとえば、2%12,14%12,26%12 =剰余2です。このようにして、範囲内に表示する必要がある数値または範囲内の数値のみを表示するデバイスがある場合、その番号がどこに戻ってくるのかを調べる。

私の例では、%12を使用しています - これは、12時間表示で表示できる合計時間です。だから、午前2時に、12時間後の時刻を知りたいのですが、私は12を追加します。しかし、私の時計は14:00(12時間モードではありません)を表示することはできません。 Modulo 12は私にリアルタイムを与えます。

例: 午前4時です。私の飛行機は29時間遅れました(恐ろしい航空会社です)。新しい離陸時間はどのようにして解決するのですか? 4 + 29%12 = 9am。 (遅延が24未満だった場合、私は午前/午後を交換する必要がありますが、あなたが画像を取得する必要があります。)

ROT13

ここでは、ROT 13と回転暗号の特殊なケースを持っていますアルファベットのみ26の文字と13を持っているので、二度、あなたに符号化されるべき元の文字を与える暗号を適用すると、26

のx = ROT13(ROT13(x))を

のちょうど半分であります実際には、暗号化を適用または元に戻すときに13を加えることや13を引くことを心配する必要はありません。だから、

、アルゴリズムはを働き、その後、どのように

  1. は、すでに述べたように、大文字のA-Zのための私達の文字コードが90の範囲65(A)(Z)であると指摘しました。しかし、モジュラー算術を使って、新しい文字が0から26までの範囲を見つけることができます。そう対象文字の文字コードから65を引く: STR [X] .charCodeAt() - 65

  2. は暗号を適用する:(STR [X] 13

    を加えます。charCodeAt() - 65 + 13)

  3. モジュロを適用して、「ループ」した文字を見つけます。 %26(アルファベットの文字数)私たちのためにどのです:

    (STR [X] .charCodeAt() - 65 + 13)%は、26

  4. 65をバック追加ので、我々は文字を持っています範囲65内のコード... 90

    (STR [X] .charCodeAt() - 65 + 13)%26 + 65)

従事例えば(S):

ROT13(X)

'X'.charCodeAt(0) = 88 

- 65 = 23 

+ 13 = 36 

%26 = 10 

+65 = 75 

charCodeFrom(75) = K 

ROT13(K)

'K'.charCodateAt(0) = 75 

- 65 = 10 

+ 13 = 23 

%26 = 23 

+65 = 88 

charCodeFrom(88) = X 

ソース(S):

http://betterexplained.com/articles/fun-with-modular-arithmetic/

https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic