brainick: нейронные сети там тоже рассматриваются. И математика там поднесена именно как инструмент - не хочешь - можешь сильно не копать (именно в матиматике).
Oscar Django: ну доп переменную - можно и не создавать ( a = a[1:]+[a[0]]).
Но оригинальное значение может для чего-то еще потребоваться, например. И в таком случае уже вам придется делать доп телодвижения, причем b = a; b.append(b.pop(0)) внезапно поменяет и оригинальную a. Так что нужно b = a.copy()
... вы можете представить кодированное сообщение в виде текста только если ваш алгоритм для каждого байта (8бит) гарантирует, что значение будет в диапазоне 32-255. Символы с кодами меньше 32 использовать нельзя - там управляющие символы, которые при печати будет либо одинаковым символом отображаться либо влиять на последовательность вывода (первод строки, возврат каретки, табуляция и т.п.)
С кодами 128-255 - тоже могут быть сложности т.к. во многих кодировках даже в этом диапазоне есть "дырки" которые либо вызовут ошибку при кодировании, либо будут заменены на один и тот же символ заменитель.
Но нужно помнить, что сильно хитрый алгоритм шифрования - это что-то написанное на коленке с криптостойкостью близкой к нулю.
Так что еще раз повторю - велосипед изобретать ненужно - ваша задача решается через base64 кодирование.
Microp: увеличение длинны на 33% зато имеем стандартное кодирование которое пролезает в любой канал передачи данных, и гарантирует 100% восстановление данных.
Ни одна кодировка не поддерживает печатаемые символы для всех 256 возможных в байте кодов. Там есть банально управляющие коды.
Кроме того в той же почте (исторически) передаются коды только диапазона 0-127 (часть из них управляющие) т.е. вообще 7 бит. Все символы что не влезают (в т.ч. и русские) автоматически кодируются в base64.
На самом деле base64 используется практически везде, где нужно бинарные данные передать текстовым сообщением. И не смотря на то что стандарту уже почти 30 лет от роду - он по сей день актуален т.к. никто ничего лучше не придумал.
Вот и вам советую - не изобретайте велосипед, пользуйтесь стандартными решениями.
Простые преобразования кодировок могут приводить к искажению информации и не всегда сработают без ошибок, из за того что не все символы из 256 возможных определены.
Для кодирования в каналах передачи вообще стоит отказаться от любых непечатных символов.
Поэтому была придумана кодировка BASE64 - там только печатаемые символы используются, но каждый символ кодирует только 6 бит.
У вас range в цикле задано по значениям первого и последнего элемента в списке, а не от первого до последнего.
Кроме того у вас каждый следующий элемент финального списка отличается от предыдущего ровно на величину элемента начального списка. если это учесть и использовать аккумулирующую переменную то все упростится до простого последовательного сложения элементов в цикле.
icsy: а по какой причине вам клиентов в общую сеть не хочется объединять? Они у вас все равно через один сервер выходить будут и если не будут роутится напрямую (в локалке), то будут роутится через сервер все-равно (если только не накручивать iptables спецом запрещать роутинг клиентов на сервере).
advirtys: да если не сосредотачиваться на нюансах - любой учебник по 2 поможет выучить и 3. Нюансы в различиях вылезут уже при начале самостоятельного программирования и использования специфики различной в версиях.