2015-12-08 4 views
0

Я разработал программу шифрования Цезаря, но мне было интересно, могу ли я сделать ее более эффективной?Как я могу сделать свой шифр Цезаря более эффективным?

#A Caesar cipher program 

##Defines the alphabet 
abc = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
     'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 

##Collects the infomation from the user 
task = input("Would you like to encrypt or decrypt?: ") 
word = input("Please enter your word: ") 
offset = int(input("Please enter your offset: ")) % 26 

##The function to work out the answer 
def workout(offset): 
    final = [] 
    for i in word: 
     try: 
      if i.isupper(): 
       final.append(abc[abc.index(i.lower()) + offset].upper()) 
      else: 
       final.append(abc[abc.index(i.lower()) + offset]) 
     except: 
      final.append(i) 

    print(''.join(final)) 

##Displays the final result 
if task == "encrypt": 
    workout(offset) 
else: 
    workout(-offset) 

Я ценю все ответы :) Спасибо!

+1

'помощь (str.translate)' ' –

ответ

0

Вот пример того, как использовать str.translate

>>> offset = 5 
>>> abc = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
...  'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 
>>> trns = str.maketrans(''.join(abc), ''.join(abc[offset:] + abc[:offset])) 
>>> "dog".translate(trns) 
'itl' 

Вы должны добавить немного дополнительный код, чтобы обрабатывать отрицательные смещения

так что ваша функция может стать

def workout(offset): 
    trns = str.maketrans(''.join(abc), ''.join(abc[offset:] + abc[:offset])) 
    print(words.translate(trns)) 

рассмотрите передачу words в качестве параметра и abc строку вместо списка

import string 
abc = string.ascii_lowercase 
ABC = string.ascii_uppercase 

def workout(offset, words): 
    trns = str.maketrans(abc + ABC, abc[offset:] + abc[:offset] + ABC[offset:] + ABC[:offset]) 
    print(words.translate(trns)) 

примечание, вы все еще нуждаетесь в дополнительных логиках, чтобы сделать отрицательные смещения работы

+0

а =«abcdefghijklmnopqrstuvwxyz'' бы лучше, и сделать вещи лучше –

+0

@StefanPochmann , или даже 'abc = string.ascii_lowercase' –

+0

Конечно, хотя это не помогает. Главным моментом является 'abc', являющийся строкой, поэтому вам больше не нужны эти'. '.join (...) ', и, таким образом, интересная часть становится проще/понятнее. –

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