ОК, я настроил его на az и дал вам небольшой тестовый фреймворк для автоматического ввода / проверки вместо того, чтобы вводить его каждый раз.
def dowork(code, distance, lower, upper):
bounddown, boundup = ord(lower), ord(upper)
plaintext = ""
for ch in code:
ordValue = ord(ch)
cipherValue = ordValue - distance
if cipherValue < bounddown:
cipherValue = boundup - bounddown - ordValue +1
plaintext += chr(cipherValue)
return plaintext
dataexp = [
(("jgnnq",2, 'a', 'z'),"hello"),
]
for input_, exp in dataexp:
got = dowork(*input_)
msg = "exp:%s:%s:got for %s" % (exp, got, inp)
if exp == got:
print("good! %s" % msg)
else:
print("bad ! %s" % msg)
Это печатает
good! exp:hello:hello:got for ('jgnnq', 2, 'a', 'z')
Теперь все, что вам нужно сделать, это добавить дополнительный элемент в список dataexp, что-то вроде
(("Lipps${svph%", 4, <lowerbound>, <upperbound char>), "Hello World!")
, как только вы определите верхнюю и нижнюю границу, это должно работать. Обратите внимание, что я не знал код цезаря, я просто скопировал ваш код, но немного его реструктурировал.
Что *_input
делает, чтобы взять эти 4 значения в этом кортеже (более или менее в списке) и назначить их до code, distance, lower, upper
в функции dowork
.
lower
- это то, что соответствует a
в вашем коде, а upper
- это z
.
exp - это то, что вы ожидаете, и exp == got
просто проверяет, вернула ли функция правильно или нет. как только вы получите правильную функцию, она будет работать для и моего упрощенного c a-z
, 2-го расстояния, hello
теста и более сложного 4-го расстояния, но включая пунктуацию
ниже и верхние границы
ваших двух строк, входных и выходных, равны Lipps${svph%
и Hello World!
. Это означает, что все эти символы должны попадать в верхние и нижние значения ord, верно? Таким образом, минимальная позиция ордера для всех них - lower
, а максимальная - upper
. Теперь я не парень из Cryptonomicon, и я не могу вспомнить, если ord (a)
окончательная версия
Это не требует, чтобы вы выяснили, какой символ ставить на нижней границе, а какой на верхней. Мы берем нижний = 32 (начало печатных символов), верхний = 255. Таким образом, знаки препинания, верхний и нижний регистр, цифры, их значения ord больше не имеют значения.
#full ASCII range, you can go to town on entering whatever you want
bounddown, boundup = 32, 255
plaintext = ""
for ch in code:
ordValue = ord(ch)
cipherValue = ordValue - distance
if cipherValue < bounddown:
cipherValue = boundup - bounddown - ordValue +1
plaintext += chr(cipherValue)