Уведомления

Группа в Telegram: @pythonsu

#1 Май 2, 2015 22:15:40

alex28746
Зарегистрирован: 2015-01-18
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Шифр Цезаря

Добрый вечер. Подскажите пожалуйста как доделать функцию, в которой параметр будет указывать на какую букву ее заменить в алфавите(что-то на подобии шифра Цезаря). Берем во внимание только английский алфавит. Замена этой буквы должна быть представлена в виде словаря.
вот что я написал, и хочу чтобы ключ остался прежним а значение поменялось на ту букву, на которую должна замениться.

def slowar(sdwig):
    slowar = { chr(i): chr(i) for i in range (65,90)}
    slowar1 = { chr(i): chr(i) for i in range (97,123)}
    ab = {}
    ab.update(slowar)
    ab.update(slowar1)
    return ab
а в итоге должно получиться вот это.
>>> slowar(3)
{ ‘A’: ‘D’, ‘C’: ‘F’, ‘B’: ‘E’, ‘E’: ‘H’, ‘D’: ‘G’,
‘G’: ‘J’, ‘F’: ‘I’, ‘I’: ‘L’, ‘H’: ‘K’, ‘K’: ‘N’, ‘J’: ‘M’,
‘M’: ‘P’, ‘L’: ‘O’, ‘O’: ‘R’, ‘N’: ‘Q’, ‘Q’: ‘T’, ‘P’: ‘S’,
‘S’: ‘V’, ‘R’: ‘U’, ‘U’: ‘X’, ‘T’: ‘W’, ‘W’: ‘Z’, ‘V’: ‘Y’,
‘Y’: ‘A’, ‘Z’: ‘B’, ‘a’: ‘d’, ‘c’: ‘f’, ‘b’: ‘e’,
‘e’: ‘h’, ‘d’: ‘g’, ‘g’: ‘j’, ‘f’: ‘i’, ‘i’: ‘l’, ‘h’: ‘k’,
‘k’: ‘n’, ‘j’: ‘m’, ‘m’: ‘p’, ‘l’: ‘o’, ‘o’: ‘r’, ‘n’: ‘q’,
‘q’: ‘t’, ‘p’: ‘s’, ‘s’: ‘v’, ‘r’: ‘u’, ‘u’: ‘x’, ‘t’: ‘w’,
‘w’: ‘z’, ‘v’: ‘y’, ‘y’: ‘a’, ‘z’: ‘b’}

Офлайн

#2 Май 2, 2015 22:45:58

alex28746
Зарегистрирован: 2015-01-18
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Шифр Цезаря

проще говоря, как применить математические операции к ключу в словаре ?)

Отредактировано alex28746 (Май 2, 2015 22:46:11)

Офлайн

#3 Май 3, 2015 00:09:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Шифр Цезаря

>>> def f(n):
...     alpha = {}
...     lower = 'abcdefghijklmnopqrstuvwxyz'
...     upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
...     ll = len(lower)
...     for i, c in enumerate(lower):
...         alpha[c] = lower[(i + n) % ll]
...     lu = len(upper)
...     for i, c in enumerate(upper):
...         alpha[c] = upper[(i + n) % lu]
...     return alpha
... 
>>> f(0)
{'d': 'd', 'e': 'e', 'f': 'f', 'g': 'g', 'a': 'a', 'b': 'b', 'c': 'c', 'l': 'l', 'm': 'm', 'n': 'n', 'o': 'o', 'h': 'h', 'i': 'i', 'j': 'j', 'k': 'k', 't': 't', 'u': 'u', 'v': 'v', 'w': 'w', 'p': 'p', 'q': 'q', 'r': 'r', 's': 's', 'x': 'x', 'y': 'y', 'z': 'z', 'D': 'D', 'E': 'E', 'F': 'F', 'G': 'G', 'A': 'A', 'B': 'B', 'C': 'C', 'L': 'L', 'M': 'M', 'N': 'N', 'O': 'O', 'H': 'H', 'I': 'I', 'J': 'J', 'K': 'K', 'T': 'T', 'U': 'U', 'V': 'V', 'W': 'W', 'P': 'P', 'Q': 'Q', 'R': 'R', 'S': 'S', 'X': 'X', 'Y': 'Y', 'Z': 'Z'}
>>> f(1)
{'d': 'e', 'e': 'f', 'f': 'g', 'g': 'h', 'a': 'b', 'b': 'c', 'c': 'd', 'l': 'm', 'm': 'n', 'n': 'o', 'o': 'p', 'h': 'i', 'i': 'j', 'j': 'k', 'k': 'l', 't': 'u', 'u': 'v', 'v': 'w', 'w': 'x', 'p': 'q', 'q': 'r', 'r': 's', 's': 't', 'x': 'y', 'y': 'z', 'z': 'a', 'D': 'E', 'E': 'F', 'F': 'G', 'G': 'H', 'A': 'B', 'B': 'C', 'C': 'D', 'L': 'M', 'M': 'N', 'N': 'O', 'O': 'P', 'H': 'I', 'I': 'J', 'J': 'K', 'K': 'L', 'T': 'U', 'U': 'V', 'V': 'W', 'W': 'X', 'P': 'Q', 'Q': 'R', 'R': 'S', 'S': 'T', 'X': 'Y', 'Y': 'Z', 'Z': 'A'}
>>> f(2)
{'d': 'f', 'e': 'g', 'f': 'h', 'g': 'i', 'a': 'c', 'b': 'd', 'c': 'e', 'l': 'n', 'm': 'o', 'n': 'p', 'o': 'q', 'h': 'j', 'i': 'k', 'j': 'l', 'k': 'm', 't': 'v', 'u': 'w', 'v': 'x', 'w': 'y', 'p': 'r', 'q': 's', 'r': 't', 's': 'u', 'x': 'z', 'y': 'a', 'z': 'b', 'D': 'F', 'E': 'G', 'F': 'H', 'G': 'I', 'A': 'C', 'B': 'D', 'C': 'E', 'L': 'N', 'M': 'O', 'N': 'P', 'O': 'Q', 'H': 'J', 'I': 'K', 'J': 'L', 'K': 'M', 'T': 'V', 'U': 'W', 'V': 'X', 'W': 'Y', 'P': 'R', 'Q': 'S', 'R': 'T', 'S': 'U', 'X': 'Z', 'Y': 'A', 'Z': 'B'}
>>> f(3)
{'d': 'g', 'e': 'h', 'f': 'i', 'g': 'j', 'a': 'd', 'b': 'e', 'c': 'f', 'l': 'o', 'm': 'p', 'n': 'q', 'o': 'r', 'h': 'k', 'i': 'l', 'j': 'm', 'k': 'n', 't': 'w', 'u': 'x', 'v': 'y', 'w': 'z', 'p': 's', 'q': 't', 'r': 'u', 's': 'v', 'x': 'a', 'y': 'b', 'z': 'c', 'D': 'G', 'E': 'H', 'F': 'I', 'G': 'J', 'A': 'D', 'B': 'E', 'C': 'F', 'L': 'O', 'M': 'P', 'N': 'Q', 'O': 'R', 'H': 'K', 'I': 'L', 'J': 'M', 'K': 'N', 'T': 'W', 'U': 'X', 'V': 'Y', 'W': 'Z', 'P': 'S', 'Q': 'T', 'R': 'U', 'S': 'V', 'X': 'A', 'Y': 'B', 'Z': 'C'}
>>>



Офлайн

#4 Май 3, 2015 01:00:25

alex28746
Зарегистрирован: 2015-01-18
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Шифр Цезаря

py.user.next
alpha = upper
а подскажи пожалуйста зачем ты использовал процент от деления?

Офлайн

#5 Май 3, 2015 01:04:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Шифр Цезаря

Чтобы он от последнего символа переходил к первому. (И это не процент, а отстаток.)



Отредактировано py.user.next (Май 3, 2015 01:05:25)

Офлайн

#6 Май 3, 2015 01:05:01

alex28746
Зарегистрирован: 2015-01-18
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Шифр Цезаря

это гениально

Офлайн

#7 Май 3, 2015 13:33:06

alex28746
Зарегистрирован: 2015-01-18
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Шифр Цезаря

и еще такой вопрос, по заданию надо добавить один символ в начале букв с нижним регистром.

'"abcdefghijklmnopqrstuvwxyz'
И теперь хочу сделать сдвиг значения не вперед а назад. По заданию должно получиться вот так
zbuduj_dekoder(3)
    {' ': 'x', 'A': 'Y', 'C': ' ', 'B': 'Z', 'E': 'B', 'D': 'A', 
     'G': 'D', 'F': 'C', 'I': 'F', 'H': 'E', 'K': 'H', 'J': 'G', 
     'M': 'J', 'L': 'I', 'O': 'L', 'N': 'K', 'Q': 'N', 'P': 'M', 
     'S': 'P', 'R': 'O', 'U': 'R', 'T': 'Q', 'W': 'T', 'V': 'S', 
     'Y': 'V', 'X': 'U', 'Z': 'W', 'a': 'y', 'c': ' ', 'b': 'z', 
     'e': 'b', 'd': 'a', 'g': 'd', 'f': 'c', 'i': 'f', 'h': 'e', 
     'k': 'h', 'j': 'g', 'm': 'j', 'l': 'i', 'o': 'l', 'n': 'k',
     'q': 'n', 'p': 'm', 's': 'p', 'r': 'o', 'u': 'r', 't': 'q', 
     'w': 't',
    'v': 's', 'y': 'v', 'x': 'u', 'z': 'w'}
у меня же выходит так
{'"': 'x', 'A': 'X', 'C': 'Z', 'B': 'Y', 'E': 'B', 'D': 'A', 'G': 'D', 'F': 'C', 'I': 'F', 'H': 'E', 'K': 'H', 'J': 'G', 'M': 'J', 'L': 'I', 'O': 'L', 'N': 'K', 'Q': 'N', 'P': 'M', 'S': 'P', 'R': 'O', 'U': 'R', 'T': 'Q', 'W': 'T', 'V': 'S', 'Y': 'V', 'X': 'U', 'Z': 'W', 'a': 'y', 'c': '"', 'b': 'z', 'e': 'b', 'd': 'a', 'g': 'd', 'f': 'c', 'i': 'f', 'h': 'e', 'k': 'h', 'j': 'g', 'm': 'j', 'l': 'i', 'o': 'l', 'n': 'k', 'q': 'n', 'p': 'm', 's': 'p', 'r': 'o', 'u': 'r', 't': 'q', 'w': 't', 'v': 's', 'y': 'v', 'x': 'u', 'z': 'w'}
def f(n):
     alpha = {}
     lower = '"abcdefghijklmnopqrstuvwxyz'
     upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
     ll = len(lower)
     for i, c in enumerate(lower):
         alpha[c] = lower[(i - n) % ll]
     lu = len(upper)
     for i, c in enumerate(upper):
         alpha[c] = upper[(i - n) % lu]
         
     return alpha
print f(3)
может кто подскажет почему так?

Отредактировано alex28746 (Май 3, 2015 13:38:16)

Офлайн

#8 Май 4, 2015 00:02:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Шифр Цезаря

>>> def f(n):
...     alpha = {}
...     lower = '"abcdefghijklmnopqrstuvwxyz'
...     upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
...     ll = len(lower)
...     for i, c in enumerate(lower):
...         alpha[c] = lower[(i + ll - n) % ll]
...     lu = len(upper)
...     for i, c in enumerate(upper):
...         alpha[c] = upper[(i + lu - n) % lu]
...     return alpha
... 
>>> f(1)
{'q': 'p', 'p': 'o', 's': 'r', 'r': 'q', 'u': 't', 't': 's', 'w': 'v', 'v': 'u', 'y': 'x', 'x': 'w', 'z': 'y', 'a': '"', 'c': 'b', 'b': 'a', 'e': 'd', 'd': 'c', 'g': 'f', 'f': 'e', 'i': 'h', 'h': 'g', 'k': 'j', 'j': 'i', 'm': 'l', 'l': 'k', 'o': 'n', 'n': 'm', 'Q': 'P', 'P': 'O', 'S': 'R', 'R': 'Q', 'U': 'T', 'T': 'S', 'W': 'V', 'V': 'U', 'Y': 'X', 'X': 'W', 'Z': 'Y', 'A': 'Z', 'C': 'B', 'B': 'A', 'E': 'D', 'D': 'C', 'G': 'F', 'F': 'E', 'I': 'H', 'H': 'G', 'K': 'J', 'J': 'I', 'M': 'L', 'L': 'K', 'O': 'N', 'N': 'M', '"': 'z'}
>>> f(2)
{'q': 'o', 'p': 'n', 's': 'q', 'r': 'p', 'u': 's', 't': 'r', 'w': 'u', 'v': 't', 'y': 'w', 'x': 'v', 'z': 'x', 'a': 'z', 'c': 'a', 'b': '"', 'e': 'c', 'd': 'b', 'g': 'e', 'f': 'd', 'i': 'g', 'h': 'f', 'k': 'i', 'j': 'h', 'm': 'k', 'l': 'j', 'o': 'm', 'n': 'l', 'Q': 'O', 'P': 'N', 'S': 'Q', 'R': 'P', 'U': 'S', 'T': 'R', 'W': 'U', 'V': 'T', 'Y': 'W', 'X': 'V', 'Z': 'X', 'A': 'Y', 'C': 'A', 'B': 'Z', 'E': 'C', 'D': 'B', 'G': 'E', 'F': 'D', 'I': 'G', 'H': 'F', 'K': 'I', 'J': 'H', 'M': 'K', 'L': 'J', 'O': 'M', 'N': 'L', '"': 'y'}
>>>

Также можешь добавить только кавычку и подавать -n.

add
Добавил двойную кавычку к заглавным буквам.
>>> def f(n):
...     alpha = {}
...     lower = '"abcdefghijklmnopqrstuvwxyz'
...     upper = '"ABCDEFGHIJKLMNOPQRSTUVWXYZ'
...     ll = len(lower)
...     for i, c in enumerate(lower):
...         alpha[c] = lower[(i + ll - n) % ll]
...     lu = len(upper)
...     for i, c in enumerate(upper):
...         alpha[c] = upper[(i + lu - n) % lu]
...     return alpha
... 
>>> f(1)
{'"': 'Z', 'm': 'l', 'l': 'k', 'o': 'n', 'n': 'm', 'i': 'h', 'h': 'g', 'k': 'j', 'j': 'i', 'e': 'd', 'd': 'c', 'g': 'f', 'f': 'e', 'a': '"', 'c': 'b', 'b': 'a', 'y': 'x', 'x': 'w', 'z': 'y', 'u': 't', 't': 's', 'w': 'v', 'v': 'u', 'q': 'p', 'p': 'o', 's': 'r', 'r': 'q', 'M': 'L', 'L': 'K', 'O': 'N', 'N': 'M', 'I': 'H', 'H': 'G', 'K': 'J', 'J': 'I', 'E': 'D', 'D': 'C', 'G': 'F', 'F': 'E', 'A': '"', 'C': 'B', 'B': 'A', 'Y': 'X', 'X': 'W', 'Z': 'Y', 'U': 'T', 'T': 'S', 'W': 'V', 'V': 'U', 'Q': 'P', 'P': 'O', 'S': 'R', 'R': 'Q'}
>>> f(2)
{'"': 'Y', 'm': 'k', 'l': 'j', 'o': 'm', 'n': 'l', 'i': 'g', 'h': 'f', 'k': 'i', 'j': 'h', 'e': 'c', 'd': 'b', 'g': 'e', 'f': 'd', 'a': 'z', 'c': 'a', 'b': '"', 'y': 'w', 'x': 'v', 'z': 'x', 'u': 's', 't': 'r', 'w': 'u', 'v': 't', 'q': 'o', 'p': 'n', 's': 'q', 'r': 'p', 'M': 'K', 'L': 'J', 'O': 'M', 'N': 'L', 'I': 'G', 'H': 'F', 'K': 'I', 'J': 'H', 'E': 'C', 'D': 'B', 'G': 'E', 'F': 'D', 'A': 'Z', 'C': 'A', 'B': '"', 'Y': 'W', 'X': 'V', 'Z': 'X', 'U': 'S', 'T': 'R', 'W': 'U', 'V': 'T', 'Q': 'O', 'P': 'N', 'S': 'Q', 'R': 'P'}
>>>



Отредактировано py.user.next (Май 4, 2015 23:53:06)

Офлайн

#9 Май 4, 2015 00:04:39

sys_dev
От:
Зарегистрирован: 2011-06-22
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Шифр Цезаря

py.user.next
… lower = ‘"abcdefghijklmnopqrstuvwxyz’ … upper = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’
А зачем их две хранить в явном виде? Нельзя ли lower сконверить в upper перед применением? Читаться будет проще



Офлайн

#10 Май 4, 2015 00:09:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Шифр Цезаря

sys_dev
Нельзя ли lower сконверить в upper перед применением?
Не, они совпали чисто случайно. Если, к примеру, ты строчные оставишь такими же, а заглавные переставишь местами, то получится пригодная функция, но преобразование из нижнего в верхний не подойдёт.

lower = 'abcdefghijklmnopqrstuvwxyz'
upper = 'DCBAEFGHIJKLMNOPQRSTUVWXYZ'



Отредактировано py.user.next (Май 4, 2015 00:11:00)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version