Несовпадение отдельных символов в Цезарь Cipher: Python - PullRequest
0 голосов
/ 18 сентября 2018

По сути, алфавиты во входной строке циклически поворачиваются на k, а остальные символы сохраняют свою форму.Я озадачен несоответствием.Для моего кода:

import math
import os
import random
import re
import sys

# Complete the caesarCipher function below.
def caesarCipher(s, k):
    st = []
    for i in range(0,len(s)):
        if 65<=ord(s[i])<=90: 
            temp = ord(s[i])+k
            if (temp>90):
                temp-=26
            st.append(chr(temp))
        elif 97<=ord(s[i])<=122:
            temp = ord(s[i])+k
            if (temp>122):
                temp-=26
            st.append(chr(temp))   
        else: st.append(s[i])
    return ''.join(st)




if __name__ == '__main__':

    s = input()

    k = int(input())

    result = caesarCipher(s, k)

Вывод всегда завершается с ошибкой, например, My: okffng-Qwvc Ожидается: okffng-Qwvb

My: Fqcfex-Qttp-ts-ymj-Gwnlmy-Xnij-tk-Qnkj Ожидается: Fqbfdx-Qttp-ts-ymj-Gwnlmy-Xnij-tk-Qnkj

Я не могу обнаружить ошибку.

1 Ответ

0 голосов
/ 18 сентября 2018

Типичное представление Цезаря Шифра использует оператор модуля. Вероятно, я бы начал там с отладки вашего кода.

Я считаю, что код легче отлаживать, если он плоский , а не вложенный . Если каждая функция выполняет одну маленькую вещь, проще полностью протестировать эту маленькую функцию и собрать их вместе, чтобы иметь правильное поведение. Возьмите следующий пример:

def _caesarLetter(c, k, offset):
    return chr((ord(c)-offset+k)%26+offset)

def caesarLetter(c, k):
    if not c.alpha():
        return c
    return _caesarLetter(c, k, ord('a') if c.islower() else ord('A'))

def caesarCipher(s, k):
    return ''.join(caesarLetter(c, k) for c in s)
  • Первый метод _caesarLetter применяет шифр к одной букве и только для фиксированной кодировки символов. Он в основном берет весь алфавит и переводит его в начало с 0, применяет шифр и перемещает алфавит туда, где он начал. Для строчных букв ascii это 97, а для прописных 65.

  • Второй метод caesarLetter позволяет выяснить, где строчные и прописные алфавиты начинаются в кодировке ascii. Вместо того, чтобы явно кодировать 65 и 97, которые подвержены опечаткам и неясным ошибкам, мы просто вычисляем их на лету. Процессорное время дешево. Время разработки дорого. Это проясняет намерение.

  • Третий метод caesarCipher просто делает это для всех букв в вашей строке и соединяет их вместе.

...