2015-10-02 2 views
1

Как я могу сделать каждую букву в сообщении закодированной, заменив ее буквой k позиций далее в алфавите ?. Например, если k = 3, «a» заменяется на «d», «b» заменяется на «e» и т. Д. Алфавит обертывается. «W» заменяется на «z», «x» на «a», «y» на «b» и «z» на «c». Вы можете предположить, что кодированное сообщение не пустое и содержит только строчные буквы и пробелы. Пространство кодируется как пробел. это то, что я пробовал, но он не работает, как нужно. Мне нужно указать количество букв для пропусков.Цезарный шифр: как принять сдвиг в качестве входных данных?

def encode(string,keyletter): 
    alpha="abcdefghijklmnopqrstuvwxyz" 
    secret = "" 
    for letter in string: 
    index = alpha.find(letter) 
    secret = secret+keyletter[index] 
    print secret 
+3

У вас есть код, что именно не работает? Вы отлаживали его? – Andrey

+1

FYI: То, что вы пытаетесь сделать, - это [Цезарский шифр] (https://en.wikipedia.org/wiki/Caesar_cipher) – NightShadeQueen

+0

, чтобы ввести количество букв для пропуска, просто используйте 'n = int (raw_input (' Количество букв для пропусков: ')) '. 'raw_input()' всегда возвращает строку – SirParselot

ответ

0

Вы можете сделать использование maketrans функции в Python для создания подходящего отображения символов следующим образом:

import string 

def encode(text, rotate_by): 
    s_from = string.ascii_lowercase 
    s_to = string.ascii_lowercase[rotate_by:] + \ 
      string.ascii_lowercase[:rotate_by] 
    cypher_table = string.maketrans(s_from, s_to) 
    return text.translate(cypher_table) 

text = raw_input("Enter the text to encode: ").lower() 
rotate_by = int(raw_input("Rotate by: ")) 
print encode(text, rotate_by) 

Это выведет:

Enter the text to encode: hello world 
Rotate by: 3 
khoor zruog 
+0

есть ошибка со второй строкой – mayna

+0

Какая у вас проблема? Я изменил его, чтобы работать только с строчными буквами. –

+0

он не будет запускаться, когда я ввожу номер поворота, появляется как ошибка. – mayna

0

Вот простая версия, которая не требуют перегруппировки альфа-строки. Обратите внимание, что это не учитывает ввод пользователя, который является неправильным, например, ввод слова вместо числа для вращения.

while 1: 
    rot = int(raw_input("Enter Rotation: ")) 
    cipher = raw_input("Enter String: ") 
    secret,alpha = '', 'abcdefghijklmnopqrstuvwxyz' 

    for i in cipher.lower(): #Loop through the original string 
     if i not in alpha:  #If the character in the original string is not in the alphabet just add it to the secret word 
      secret += i 
     else: 
      x = alpha.index(i) #Get index of letter in alphabet 
      x = (x+rot)%26 #Find the index of the rotated letter 
      secret += alpha[x] #Add the new letter to the secret word 
    print f 

вы можете конденсируетесь все в цикл для одной линии, но это не так хорошо, чтобы читать, как так

f += i if i not in s else s[(s.index(i)+rot)%26] 

Если вы хотите получить фантазии с Caesar Cipher затем посмотреть вверх шпонку Цезаря Cipher и добавьте эту опцию также. Это потребует манипулирования вашей альфа-строкой.

Смежные вопросы