Класс с методами шифрующими и расшифровывающими строку по позиции каждого элемента строки в алфавите
Задача:
Написать класс Cipher, принимающий строку в качестве аргумента и располагающий элементы строки на первых позициях алфавита. С методами, шифрующими и расшифровывающими заданное слово по позициям каждого элемента строки в обновленном алфавите.
Например:
>>>c = Cipher('orange')
>>>c.alphabet
O R A N G E B C D F H I J K L M P Q S T U V W X Y Z
>>>c.encode('Hello World')
"Btggj vjmgp"
>>>c.decode("Fjedhc dn atidsn")
"Kojima is genius"
Мой код:
import string
class Cipher:
def __init__(self, name):
alphabet = list(string.ascii_uppercase)
self.x = list(name.upper())
for j in self.x:
alphabet.remove(j)
self.x.extend(alphabet)
self.alp = ''.join(i for i in self.x)
def encode(self, data):
alphabet = string.ascii_uppercase
x = data.upper().split()
ind =[]
d = []
for i in range(0, len(x)):
z = []
for j in x[i]:
z.append(alphabet.index(j))
if x[i].index(j) == len(x[i]) - 1:
ind.append(z)
for i in range(0, len(ind)):
s1 = ''
for j in ind[i]:
s1 += self.alp[j]
if ind[i].index(j) == len(x[i]) - 1:
d.append(s1)
return ' '.join(i for i in d)
def decode(self, data):
alphabet = string.ascii_uppercase
x = data.upper().split()
ind = []
d = []
for i in range(0, len(x)):
z = []
for j in x[i]:
z.append(self.alp.index(j))
if x[i].index(j) == len(x[i]) - 1:
ind.append(z)
for i in range(0, len(ind)):
s1 = ''
for j in ind[i]:
s1 += alphabet[j]
if ind[i].index(j) == len(x[i]) - 1:
d.append(s1)
return ' '.join(i for i in d)
В результате я получаю ожидаемую строку, но заглавными буквами. Без приведения всех элементов в заглавный вид не получается без ошибки соотносить элементы строки с алфавитом. Как добиться результирующей строки в том же виде, что была задана изначальная?
Ответы (1 шт):
Вариантов решения вашей проблемы достаточно много.
Приведу два самых очевидных:
Хранить алфавит в двух вариациях: верхнем и нижнем регистре
self.alphabet += self.alphabet.lower()В итоге из
ORANGEBCDFHIJKLMPQSTUVWXYZполучаемORANGEBCDFHIJKLMPQSTUVWXYZorangebcdfhijklmpqstuvwxyzДля кодирования/декодирования вам будет необходимо сравнивать не с исходным алфавитом
ascii_uppercase(), а с таким же расширенным:alphabet += alphabet.lower(), исходный текст трогать не нужно.При преобразовании учитывать исходный регистр символа
Если символ в исходной строке был в нижнем регистре:
x[i].islower(), то добавлять к результатуalphabet[i].lower(), и наоборот при помощи методаx[i].isupper()иalphabet[i].upper()