Класс с методами шифрующими и расшифровывающими строку по позиции каждого элемента строки в алфавите

Задача:

Написать класс 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 шт):

Автор решения: Павел

Вариантов решения вашей проблемы достаточно много.

Приведу два самых очевидных:

  1. Хранить алфавит в двух вариациях: верхнем и нижнем регистре

    self.alphabet += self.alphabet.lower()

    В итоге из ORANGEBCDFHIJKLMPQSTUVWXYZ получаем ORANGEBCDFHIJKLMPQSTUVWXYZorangebcdfhijklmpqstuvwxyz

    Для кодирования/декодирования вам будет необходимо сравнивать не с исходным алфавитом ascii_uppercase(), а с таким же расширенным: alphabet += alphabet.lower(), исходный текст трогать не нужно.

  2. При преобразовании учитывать исходный регистр символа

    Если символ в исходной строке был в нижнем регистре: x[i].islower(), то добавлять к результату alphabet[i].lower(), и наоборот при помощи метода x[i].isupper() и alphabet[i].upper()

→ Ссылка