Форум сайта python.su
FishHookсогласен можно и так но я сделал замену в списке и в чем тут была проблема с циклом?
Проходимся по исходному тексту и создаем новый - зашифрованный
Офлайн
marvellikВ том, что так не делают.
согласен можно и так но я сделал замену в списке и в чем тут была проблема с циклом?
Офлайн
хорошо переделал как делают что теперь скажете?
def decode(word,key): decode_word = '' for i in word: register = 65 if i == i.upper() else 97 letter = chr(register + (ord(i) - register - int(key)) % 26) decode_word += letter return decode_word with open('input.txt','r') as file: text = file.read().split() word_key = iter(text) for word,key in (zip(word_key ,word_key )): print(decode(word,key))
Отредактировано marvellik (Май 16, 2016 19:45:00)
Офлайн
marvellikТеперь лучше
теперь скажете
# -*- coding:utf-8 -*- import string def get_alphabet(offset): keys = list(string.ascii_lowercase) values = list(keys[offset:] + keys[:offset]) keys += [l.upper() for l in keys] + [" "] values += [l.upper() for l in values] + [" "] return dict(zip(keys, values)) def encode(text, alphabet): return "".join(alphabet[w] for w in text) def decode(text, alphabet): reverse_alphabet = {v: k for k, v in alphabet.items()} return encode(text, reverse_alphabet) alphabet = get_alphabet(5) text = "Hellow word" encoded = encode(text, alphabet) print(encoded) decoded = decode(encoded, alphabet) print(decoded)
Отредактировано FishHook (Май 17, 2016 06:42:36)
Офлайн
а есть ли смысл создавать словарь кодированных букв? каждое слово имеет свой ключ (согласно условию вопроса темы) и при перекодировке каждый раз создавать новый словарь менять местами ключ-значение? как это сказывается на времени выполнения и объеме памяти? дело в том что на тестирующей системе эти параметры отслеживаются и правильное решение может не пройти если не соответствует этим параметрам.про магические цифры - это я подсмотрел где то на форуме когда решал задачу шифрования по длине слова и нужен был циклический сдвиг. можно было бы использовать список букв и длину списка но мне так показалось проще
Офлайн
marvellik
То есть alphabet.find() в цикле вас делать не напрягает, а создать один раз словарь на 53 ключа - оверхед?
Глупости совершеннейшие.
Офлайн
спасибо. все понятно и доступно. особенно мне понравилась реализация def get_alphabet(offset)
Офлайн
FishHookможет быть кроме всего прочего он еще и работать должен а ваш при ключе свыше 25 перестает работать. а при получении данных из файла неправильно дешифрует.
Я не претендую на истину в последней инстанции, но мне кажется, что pythonic код должен выглядеть как-то так
import string def get_alphabet(offset): keys = list(string.ascii_lowercase) values = list(keys[offset:] + keys[:offset]) keys += [l.upper() for l in keys] + [" "] values += [l.upper() for l in values] + [" "] return dict(zip(keys, values)) def encode(word, alphabet): return "".join(alphabet[w] for w in word) with open('input.txt') as file: text = file.read().split() word_key = iter(text) for word,key in (zip(word_key ,word_key )): alphabet = get_alphabet(int(key)) print(encode(word, alphabet))
Отредактировано marvellik (Май 17, 2016 15:56:02)
Прикреплённый файлы: input.txt (56 байт)
Офлайн
Я не понимаю, что вы вообще делаете.
Суть вот этих телодвижений я осознать не могу.
word_key = iter(text) for word,key in (zip(word_key ,word_key )):
marvellikдопиливайте сами, я не собирался давать вам готовое решение какой-то частной задачи. Я вам показал, как пишут программы на питоне.
а ваш при ключе свыше 25 перестает работать
Офлайн
FishHook
Я не понимаю, что вы вообще делаете.
Суть вот этих телодвижений я осознать не могу.
text = ['Udymts', '5', 'Pula', '22', 'sefohywxj', '16', 'kzmlqba', '8', 'khbdmrd', '25']
blmnkя под вопрос автора писал код.допиливает пусть автор а мне больше нужно понять и вникнуть во все нюансы
Как мне брать слова и ключи из листа, который получается при разбиении строк исходного файла
Отредактировано marvellik (Май 17, 2016 18:24:22)
Офлайн