Шифр Цезаря, который сдвигает каждую букву на другое значение? - PullRequest
0 голосов
/ 26 января 2020

Цель состоит в том, чтобы иметь программу, которую я могу ввести, например, «helloworld» и «0123456789», и получить «hfnosbuytm» в качестве вывода. В отличие от обычного шифра Цезаря, он предназначен только для сдвига от 0 до 9 букв на символ. И строка, и ключ имеют одинаковую длину, поэтому я понимаю, что мне нужно использовать одно и то же значение длины и сдвинуть их в a для l oop, но у меня возникли проблемы с синтаксисом. Вот что у меня получилось:

def getdigit(number, n):
    return int(number) // 10**n % 10

message = "helloworld"
key = "0123456789"
alphabet = "abcdefghijklmnopqrstuvwxyz"
encoded = "".join([alphabet[(alphabet.find(char)+getdigit(key, char))%26] for char in message])
print(encoded)

Но это выдает ошибку:

Traceback (most recent call last):
  File "c:\users\ants\mu_code\blank.py", line 7, in <module>
    encoded = "".join([alphabet[(alphabet.find(char)+getdigit(key, char))%26] for char in message])
  File "c:\users\ants\mu_code\blank.py", line 7, in <listcomp>
    encoded = "".join([alphabet[(alphabet.find(char)+getdigit(key, char))%26] for char in message])
  File "c:\users\ants\mu_code\blank.py", line 2, in getdigit
    return int(number) // 10**n % 10
TypeError: unsupported operand type(s) for ** or pow(): 'int' and 'str'

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

1 Ответ

0 голосов
/ 26 января 2020

В вашем коде есть ошибка типа, потому что вы определили функцию getdigit как number как строку и n как целое число, но затем вы назвали эту функцию как getdigit(key, char), где key это строка и char также является строкой - это одна буква из message, поскольку она взята из for char in message.

. Непосредственно исправить это не будет тривиальным, потому что n должно быть index , где char встречается в message, но ваш код не знает индекс, и вы не можете использовать метод message.index(char), чтобы найти его, потому что это дает индекс первое вхождение char, а не индекс текущего вхождения. enumerate функция может быть использована для доступа к индексам в вашем понимании списка.

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

>>> message = "helloworld"
>>> key = "0123456789"
>>> for char, digit in zip(message, key):
...     print('char:', char, 'digit:', digit)
... 
char: h digit: 0
char: e digit: 1
char: l digit: 2
char: l digit: 3
char: o digit: 4
char: w digit: 5
char: o digit: 6
char: r digit: 7
char: l digit: 8
char: d digit: 9
...