Почему существует% 26 (Python)? - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь расшифровать текст от пользователя, не зная ключа в cesar cipher.

Я, наверное, понимаю большинство из них, но не понимаю, почему они используют мод 26 в строке 8



alphabet=['a','b','c','d','e','f','g','h','i','j','k','l','m',
    'n','o','p','q','r','s','t','u','v','w','x','y','z']
print('write the message you want to decode?')
inputString = input()
inputString = inputString.lower()

transAlphabet = {}

def createDict(shift):
    for i in range(0,26):
        letter = alphabet[i]

        transAlphabet[letter]=alphabet[(i+shift)%26]


def encodeMessage(message):
    cypherText = ''
    for letter in message:
        if letter in transAlphabet:

            cypherText = cypherText + transAlphabet[letter]
        else:
            cypherText = cypherText + letter
    print(cypherText)

for i in range(0,26):
    createDict(i)
    encodeMessage(inputString)



Пожалуйста, было бы очень полезно, если бы кто-то помог мне, спасибо!

1 Ответ

1 голос
/ 03 ноября 2019

Модуль %26 должен сделать алфавит круглым, когда вы на z вернетесь на a

Пример для alph[(i + shift) % 26] с i=20 и shift=10

  • без модуля вы хотите достичь индекса 30 в массиве и его не существует
  • с модулем вы достигнете индекса 30%26 = 4 в массиве, букваe

Но ваш алгоритм немного странен, я бы сделал переключение на лету для каждой машины, но ваше решение может быть более эффективным для длинного текста, чем выне нужно вычислять сдвиг каждый раз.

Если вы не вычислили смещенный алфавит раньше, это выглядело бы так:

from string import ascii_lowercase
alphabet = ascii_lowercase

def encode_message(message, shift):
    cypher_text = ''
    for letter in message:
        letter_idx = alphabet.index(letter)
        cypher_text = cypher_text + alphabet[(letter_idx + shift) % 26]
    return cypher_text

def decode_message(message, shift):
    cypher_text = ''
    for letter in message:
        letter_idx = alphabet.index(letter)
        cypher_text = cypher_text + alphabet[(26 + letter_idx - shift) % 26]
    return cypher_text
...