Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2022, 00:36   #1
Kir_I
 
Регистрация: 06.12.2022
Сообщений: 6
По умолчанию [Python]Простейшая функция, проблема со списками, код Цезаря

Я пытаюсь без библиотек сделать функцию обладающую способностью простейшего шифрования(Код Цезаря с шагом 1), но у меня никак не получается исправить ошибку со списками


Код:
def definition(text=input()):

    Alfa_list = ['а', 'б', 'в', 'г', 'д', 'е',
                 'ё', 'ж', 'з', 'и', 'й', 'к',
                 'л', 'м', 'н', 'о', 'п', 'р',
                 'с', 'т', 'у', 'ф', 'х', 'ц',
                 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь',
                 'э', 'ю', 'я']

    Text_list = list(text)
    Text_b = Text_list
    timer = 0
    n = len(Text_list)
    n1 = 0

    for i in range(1,len(Text_list)+1):

        while timer < len(Text_list):

            if Text_b[n] != Alfa_list[n1]:
                n1 += 1

            else:
                Text_b[n] = Alfa_list[n1]
                n -= 1
                n1 = 0

                if n == len(Text_list):
                    break
                timer += 1


    print(Text_b)


definition()

Последний раз редактировалось BDA; 09.12.2022 в 00:59.
Kir_I вне форума Ответить с цитированием
Старый 09.12.2022, 01:14   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

В переменной n изначально хранится вся длина Text_b, но элементы имеют номера от 0 до n-1 (нет элемента с номером n). И не стоит input() использовать как значение по умолчанию, т.к. она будет вызвана только один раз, даже если вызвать definition несколько раз.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.12.2022, 03:51   #3
Kir_I
 
Регистрация: 06.12.2022
Сообщений: 6
По умолчанию

BDA, Я немного изменил код и ошибка пропала, но появилась другая проблема


Код:
def definition(text=input()):

    Alfa_list = ['а', 'б', 'в', 'г', 'д', 'е',
                 'ё', 'ж', 'з', 'и', 'й', 'к',
                 'л', 'м', 'н', 'о', 'п', 'р',
                 'с', 'т', 'у', 'ф', 'х', 'ц',
                 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь',
                 'э', 'ю', 'я']

    Text_list = list(text)
    Text_b = Text_list
    timer = 0
    n = 0
    n1 = -1

    for i in range(1,len(Text_list)+1):

        while timer < len(Text_list):

            if Text_b[n] == Alfa_list[n1]:
                n1 += 1

            else:
                Text_b[n] = Alfa_list[n1]
                n -= 1
                n1 = 0

                if n == len(Text_list):
                    break
                timer += 1


    print(Text_b)


definition()
При вводе текста на все буквы кроме а выводится а

абвгдеёжз
['я', 'а', 'а', 'а', 'а', 'а', 'а', 'а', 'а']

Последний раз редактировалось BDA; 09.12.2022 в 03:56.
Kir_I вне форума Ответить с цитированием
Старый 09.12.2022, 04:07   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не могу подсказать, как исправить, т.к. не пойму идею вашего решения. Есть лишний код (что делает цикл по i?) и лишние переменные (timer и n делают что-то очень похожее).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.12.2022, 04:21   #5
Kir_I
 
Регистрация: 06.12.2022
Сообщений: 6
По умолчанию

BDA, Если честно я так много переделывал этот код что надобность в цикле for отпала, а лишняя переменная(timer) нужна была как костыль. Я пересмотрел код и изменил его, но он попросту выдаёт то же текст, а в теории должен заменять каждую букву на следующуюю.



Код:
def definition(text=input()):

    Alfa_list = ['а', 'б', 'в', 'г', 'д', 'е',
                 'ё', 'ж', 'з', 'и', 'й', 'к',
                 'л', 'м', 'н', 'о', 'п', 'р',
                 'с', 'т', 'у', 'ф', 'х', 'ц',
                 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь',
                 'э', 'ю', 'я']

    Text_list = list(text)
    Text_b = Text_list
    timer = 0
    n = 0
    n1 = 0


    while timer < len (Text_list):

        if Text_b[n] == Alfa_list[n1]:
            Text_b[n] = Alfa_list[n1+1]
            n += 1

        else:
            n1 = 0
            timer += 1

Последний раз редактировалось BDA; 09.12.2022 в 12:55.
Kir_I вне форума Ответить с цитированием
Старый 09.12.2022, 13:01   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

С минимальными изменениями:
Код:
def definition(text):
    alfa_list = ['а', 'б', 'в', 'г', 'д', 'е',
                 'ё', 'ж', 'з', 'и', 'й', 'к',
                 'л', 'м', 'н', 'о', 'п', 'р',
                 'с', 'т', 'у', 'ф', 'х', 'ц',
                 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь',
                 'э', 'ю', 'я', 'а']

    text_list = list(text)
    text_list_len = len(text_list)
    n = 0
    n1 = 0

    while n < text_list_len:
        if text_list[n] == alfa_list[n1]:
            text_list[n] = alfa_list[n1 + 1]
            n1 = 0
            n += 1
        else:
            n1 += 1

    return text_list

print(definition(input()))
Подавать на вход можно будет только те буквы, что есть в списке, иначе всё сломается
Для оформления кода используйте кнопку CODE (для питона это даже более важно, чем для других языков, т.к. отступы влияют на результат).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.12.2022, 19:03   #7
Kir_I
 
Регистрация: 06.12.2022
Сообщений: 6
По умолчанию

BDA, Спасибо большое
Kir_I вне форума Ответить с цитированием
Старый 10.12.2022, 00:18   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Думаю, что задача будет решаться проще, если использовать два алфавита - основной и сдвинутый.

Тогда ищем позицию символа из текста в основном и заменяем его на символ из сдвинутого.
1. Величину сдвига можно рассматривать как ключ - число со знаком (сдвиг вправо или влево).
Сдвинутый алфавит может быть сгенерирован функцией.
Как это сделать лучше подумать самому: append(), insert() и pop() вам помогут.

2. Исходный алфавит может быть латинским.

3. Функция шифрования работает и на расшифрование.

4. Сдвинутый алфавит можно получить и случайным перемешиванием.
Правда, для расшифрования такой алфавит (случайное перемешивание) лучше сохранять для расшифрования.

PS: В функции шифрования можно предусмотреть ситуацию, когда символ отсутствует в исходном алфавите.
Такой символ можно заменять на стандартный, например, +, -, ! и т.п. заменяем на :
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Python]Простейшая функция, проблема со списками Kir_I Python 2 06.12.2022 03:36
Python. Функция Input(), проблема с типами данных Cyboredis Python 8 25.06.2016 21:28
Простейшая функция max74max PHP 7 04.02.2012 00:14
Простейшая функция vostok Microsoft Office Excel 5 19.04.2011 17:19
Простейшая функция вычислить tg(x) homa371 Паскаль, Turbo Pascal, PascalABC.NET 7 20.01.2011 12:58