2013-08-16 2 views
-1

Это мое задание:Расшифровка ввода?

Написать программу, которая ДЕКРИПТЕТ секретные сообщения.

Сначала следует запросить пользователя для скремблированного алфавита. Затем он должен запросить секретное сообщение. Наконец, он выводит версию без расшифровки.

Обратите внимание, что для скремблированного алфавита имеется ровно 26 символов. Все алфавитные символы переводятся в их декодированные эквиваленты (которые будут проходить цикл WHILE), а все другие, неалфавитные символы должны выводиться точно так же, как они были без перевода.

Это мой код до сих пор:

decrypt = ["*"] * 26 

scram_alphabet = input("Please input the scrambled alphabet in order: ") 

while len(scram_alphabet) != 26: 
    scram_alphabet = input("Please input the scrambled alphabet in order. The alphabet must have 26 characters: ") 

num = 0 

for each_letter in scram_alphabet: 
    decrypt[num] = ord(each_letter) 
    num = num + 1 

print() 

print("Your scrambled alphabet is: ", end = "") 

for num in range (26): 
    print(chr(decrypt[num]), end = "") 

print() 
print() 

msg = input("Now input your scrambled message: ") 

print() 
print() 

alphabet = 65 

for s in range (26): 
    decrypt[s] = (alphabet) 
    alphabet = alphabet + 1 

print("The unscrambled alphabet is: ", end = "") 


for num in range (26): 
    print(chr(decrypt[num]), end = "") 

print() 
print() 

print("Your unscrambled message reads: ") 

for alpha in msg.upper(): 
    if alpha < "A" or alpha > "Z": 
     print(alpha, end="") 
    else: 
     ord_alpha = ord(alpha) 
     print (chr(decrypt[ord_alpha - 65]), end = "") 

Ex: Яичница алфавит = XQHAJDENKLTCBZGUYFWVMIPSOR, Яичница сообщение = VNKW KW BO 1WV WJHFJV BJWWXEJ!

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

Любые помощники?

+0

для чего это стоит (и дать вам то, чтобы проверить против), это довольно длинный 2-лайнер (один если вы не считаете импорт): 'str.translate ('VNKW KW BO 1WV W JHFJV BJWWXEJ! ', String.maketrans (' XQHAJDENKLTCBZGUYFWVMIPSOR ', string.ascii_uppercase)) ' – mgilson

+1

Подсказка: в третьем цикле' for' вы полностью перезаписываете содержимое массива 'decrypt []', игнорируя ранее введенный скремблированный алфавит ... – Stobor

+0

@Stobor: Не возражаете ли вы разработать? Я не уверен, что вы имеете в виду, я снова решил расшифровать = [0] * 26 и распечатать все пробелы -> "1!" – user2680935

ответ

2

Ну, как уже отмечались, вы затирание вашей decrypt переменного. Однако вы также не строите отображение из «скремблированного» алфавита в обычный/полностью.

Дешифровка без использования ничего больше, чем основной итерации по спискам и простой список функций (index()) может выглядеть примерно так:

cleartext = "" 
for c in msg: 
    if c in alphabet: 
     pos = alphabet.index(c) 
     cleartext += string.ascii_uppercase[pos] 
    else: 
     cleartext += c 

Вместо того, чтобы просто латать свой код, он может извлечь выгоду из некоторого улучшения. Я понимаю, что это, вероятно, домашнее задание, и вы, вероятно, не ожидаете, что зайдите так далеко, но ИМО в этом нет ничего плохого в изучении.

  • Вы не проверяя, что входной алфавит содержит только то, что вы считаете правовые ценности (например, возможно, A-Z в данном случае), ни вы для проверки дублирует. Пользователь может ввести любой старый мусор и в противном случае сломать вашу программу.
  • Ваша печать и зацикливание не очень idiomatic.
  • Функции хороши для разбивки кода на более легко читаемые и ремонтные элементы.
  • Это может показаться старой школой или педантиком, но для Python не рекомендуется использовать строки длиной более 80 символов. Смежные строковые литералы (например, «один» «два») будут объединены (даже в новых линиях).

Если бы я должен был сделать то, что вы делаете без translate (смотри ниже), я мог бы сделать что-то вроде этого (просто быстрый пример, вероятно, можно было бы улучшить с небольшим количеством работы):

import string 

def validate(alpha): 
    # Is it exactly 26 characters long? 
    if len(alpha) != 26: return False 
    for c in alpha: 
     # Is every character in [A-Z]? 
     if c not in string.ascii_uppercase: return False 
     # Is this character duplicated? 
     if alpha.count(c) > 1: return False 
    return True 


alphabet = "" 
while not validate(alphabet): 
    alphabet = input("Please input the encryption alphabet in order (only A-Z" 
        " allowed, with no duplicates): ") 

msg = input("Now input your encrypted message: ") 

print("Your encrypted alphabet is:", alphabet) 
print("Your encrypted message is:", msg) 

# Create a mapping from one alphabet to the other using a dictionary 
table = dict(zip(alphabet, string.ascii_uppercase)) 
cleartext = "".join([table[c] if c in table else c for c in msg]) 

print("Your decrypted message reads:", cleartext) 

Наконец, вы также можете сделать это, используя встроенную строку перевода Питона, например, так:

import string 
# read and validate alphabet 
# read message 
print(str.translate(message, str.maketrans(alphabet, string.ascii_uppercase))) 
1

Вы затирание расшифровывать после вы написали все кодированные письма в него:

crypt = ["*"] * 26 
for s in range (26): 
    val = decrypt[s] - 65 
    crypt[val] = (s + 65) 
+0

печатает "IZTP TP QG 1PI PLNDLI QLPPSJL!" , он должен печатать что-то в строках «ЭТО МОЕ 1-Й СЕКРЕТНОЕ СООБЩЕНИЕ» – user2680935

+1

Комментируя этот раздел, вы получите код ** encrypt **, который примет строку '' THIS IS MY 1ST SECRET MESSAGE! '' и поверните это в '' VNKW KW BO 1WV WJHFJV BJWWXEJ! '' - недостающая магия - это код для инвертирования содержимого расшифровки. – Stobor

+0

@Stobor правый думаю. newarr [decrypt [alphbet]] или что-то в этом роде, затем используйте newarr для дешифрования сообщения. – Jiminion

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