Уведомления

Группа в Telegram: @pythonsu

#1 Май 16, 2016 13:15:22

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

FishHook
Проходимся по исходному тексту и создаем новый - зашифрованный
согласен можно и так но я сделал замену в списке и в чем тут была проблема с циклом?

Офлайн

#2 Май 16, 2016 13:30:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

marvellik
согласен можно и так но я сделал замену в списке и в чем тут была проблема с циклом?
В том, что так не делают.



Офлайн

#3 Май 16, 2016 18:11:16

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

хорошо переделал как делают что теперь скажете?

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))
кстати пробел после return в исходном коде есть но тут он пропадает

Отредактировано marvellik (Май 16, 2016 19:45:00)

Офлайн

#4 Май 17, 2016 06:42:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

marvellik
теперь скажете
Теперь лучше
правда, магические числа несколько напрягают
Я не претендую на истину в последней инстанции, но мне кажется, что pythonic код должен выглядеть как-то так
# -*- 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)

Офлайн

#5 Май 17, 2016 09:42:59

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

а есть ли смысл создавать словарь кодированных букв? каждое слово имеет свой ключ (согласно условию вопроса темы) и при перекодировке каждый раз создавать новый словарь менять местами ключ-значение? как это сказывается на времени выполнения и объеме памяти? дело в том что на тестирующей системе эти параметры отслеживаются и правильное решение может не пройти если не соответствует этим параметрам.про магические цифры - это я подсмотрел где то на форуме когда решал задачу шифрования по длине слова и нужен был циклический сдвиг. можно было бы использовать список букв и длину списка но мне так показалось проще

Офлайн

#6 Май 17, 2016 09:52:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

marvellik
То есть alphabet.find() в цикле вас делать не напрягает, а создать один раз словарь на 53 ключа - оверхед?
Глупости совершеннейшие.



Офлайн

#7 Май 17, 2016 10:08:35

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

спасибо. все понятно и доступно. особенно мне понравилась реализация def get_alphabet(offset)

Офлайн

#8 Май 17, 2016 15:54:51

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

FishHook
Я не претендую на истину в последней инстанции, но мне кажется, что pythonic код должен выглядеть как-то так
может быть кроме всего прочего он еще и работать должен а ваш при ключе свыше 25 перестает работать. а при получении данных из файла неправильно дешифрует.
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)

Прикреплённый файлы:
attachment input.txt (56 байт)

Офлайн

#9 Май 17, 2016 16:34:41

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

Я не понимаю, что вы вообще делаете.
Суть вот этих телодвижений я осознать не могу.

word_key = iter(text)
for word,key in (zip(word_key ,word_key )):

marvellik
а ваш при ключе свыше 25 перестает работать
допиливайте сами, я не собирался давать вам готовое решение какой-то частной задачи. Я вам показал, как пишут программы на питоне.



Офлайн

#10 Май 17, 2016 18:15:32

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Простая версия дешифровщика

FishHook
Я не понимаю, что вы вообще делаете.
Суть вот этих телодвижений я осознать не могу.
text = ['Udymts', '5', 'Pula', '22', 'sefohywxj', '16', 'kzmlqba', '8', 'khbdmrd', '25']
получаю слово и ключ из списка. или опять что то не правильно? а какие еще есть простые варианты?

blmnk
Как мне брать слова и ключи из листа, который получается при разбиении строк исходного файла
я под вопрос автора писал код.допиливает пусть автор а мне больше нужно понять и вникнуть во все нюансы

Отредактировано marvellik (Май 17, 2016 18:24:22)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version