0

edx.com でこのコースのコードを見つけました。for ループで残りを使用する必要がある理由を誰か教えてもらえますか? それはdictにどのように影響しますか?

def buildCoder(shift):
    """
    Returns a dict that can apply a Caesar cipher to a letter.
    The cipher is defined by the shift value. Ignores non-letter characters
    like punctuation, numbers and spaces.

    shift: 0 <= int < 26
    returns: dict
    """
    dict={}
    upper = string.ascii_uppercase
    lower = string.ascii_lowercase
    for l in range(len(upper)):
        dict[upper[l]] = upper[(l+shift)%len(upper)]
    for l in range(len(lower)):
        dict[lower[l]] = lower[(l+shift)%len(lower)]
    return dict
4

1 に答える 1

5

このコードはシーザー暗号を実装しています。シフト値が 1 だとします (これが「キー」です)。'A' は 'B' になり、'B' は 'C' になります。「Z」に到達するまで、すべてが明らかです。暗号が機能する方法は、値が「ロールオーバー」することです。「Z」は再び「A」になります。

これは本質的に、残りの部分が行うことです。文字の代わりに数字を使用するとします。「A」は 0、「Z」は 25 です。数字 x を暗号化したいとします。最初に x: (x+shift) を追加します。しかし、現在、値は正当な範囲 0 ~ 25 の外にある可能性があります。26 の場合は実際には 0 である必要があり、27 の場合は実際には 1 である必要があります。

結局のところ、これは数学的には 26 で割った余りを取ることと同じです。26%26 == 0、27%26 == 1 などです。それが表しているのは、26 サイクルの長さのサイクルを何回通過したかは問題ではなく、現在のサイクルにどれだけ進んでいるかだけが問題であるということです。

于 2013-05-05T18:37:32.773 に答える