将用户输入转换为适合密码后移动字母

问题描述

我不是最擅长使用 python 的,我正在尝试对用户输入的文本进行密码转换。该密码的工作方式是忽略符号、数字等。它还可以将句号转换为 X,并且必须全部为大写。我目前拥有该代码,但不确定如何获取转换后的文本并将其按用户提供的数字进行移动。不确定这一切是否有意义,但任何帮助将不胜感激!

这是我的代码


def convert_to_Caesar(t):
      
    #Remove all special characters and only show A-Z
    t = re.sub("[^A-Za-z.]",'',t)
    cipherText = ""
    # Full stops are replaced with X's
    for letter in t:
        if letter == '.':
            cipherText += 'X'
    # Lower case is converted to upper case
    
        else: 
            cipherText += letter.upper()
    # Plain text is ciphered and returned
    
    return cipherText


    

# User enters plain text to cipher
text = input("What do you want to cipher? ")
shift = int(input("How many positions to shift by? "))

print(convert_to_Caesar(text))

谢谢

解决方法

您可以按照@Girish Srivatsa 的建议使用 ord()/chr():

alphabet_len = ord('Z') - ord('A') + 1
new_letter = chr((ord(letter.upper()) - ord('A') + shift) % alphabet_len + ord('A'))

但如果您只创建一个保存字母表的变量可能会更清晰:

import string
alphabet = "".join(list(string.ascii_uppercase))

然后你看看你在字母表中查找的位置,添加位置,然后查找新字母是什么:​​

pos = alphabet.find(letter.upper())
if pos == -1:
  if letter == '.':
     new_letter = 'X'
  else:
     # discard other symbols
     new_letter = ''
else:
  new_pos = (pos + shift) % len(alphabet)      
  new_letter = alphabet[new_pos]

请注意,您无法判断密文中的“X”是移位字母还是“.”。如果您需要修复该问题,请添加“.”到您的字母表并删除 '.' 的特殊情况。在 if pos == -1 下。使用 chr()/ord() 方法会变得混乱。

,

如果您希望它的格式更正确,请遵循所有规则,但也要使用大写和小写格式。这会移动字典,并在循环时运行。我知道您要求所有字母都为大写,但这会稍微改进代码。

代码输出:

Do you want to... 1. Encode,or 2. Decode? 1
This must be encoded! Please,Work!
5
Ymnx rzxy gj jshtiji! Uqjfxj,Btwp!

代码:

import time
def shift_dict(Caesar,Shift):
  dic_len = len(Caesar)
  Shift = Shift % dic_len
  list_dic = [(k,v) for k,v in iter(Caesar.items())]
  Shifted = {
    list_dic[x][0]: list_dic[(x - Shift) % dic_len][1]
    for x in range(dic_len)
  }
  return Shifted
def shift_dict2(Caesar,v in iter(Caesar.items())]
  Shifted = {
    list_dic[x][0]: list_dic[(x - Shift) % dic_len][-1]
    for x in range(dic_len)
  }
  return Shifted

UpperList = {
  "A":0,"B":1,"C":2,"D":3,"E":4,"F":5,"G":6,"H":7,"I":8,"J":9,"K":10,"L":11,"M":12,"N":13,"O":14,"P":15,"Q":16,"R":17,"S":18,"T":19,"U":20,"V":21,"W":22,"X":23,"Y":24,"Z":25
}
UpperCaesar = {
  "A":"A","B":"B","C":"C","D":"D","E":"E","F":"F","G":"G","H":"H","I":"I","J":"J","K":"K","L":"L","M":"M","N":"N","O":"O","P":"P","Q":"Q","R":"R","S":"S","T":"T","U":"U","V":"V","W":"W","X":"X","Y":"Y","Z":"Z"
}
LowerList = {
  "a":0,"b":1,"c":2,"d":3,"e":4,"f":5,"g":6,"h":7,"i":8,"j":9,"k":10,"l":11,"m":12,"n":13,"o":14,"p":15,"q":16,"r":17,"s":18,"t":19,"u":20,"v":21,"w":22,"x":23,"y":24,"z":25

}
LowerCaesar = {
  "a":"a","b":"b","c":"c","d":"d","e":"e","f":"f","g":"g","h":"h","i":"i","j":"j","k":"k","l":"l","m":"m","n":"n","o":"o","p":"p","q":"q","r":"r","s":"s","t":"t","u":"u","v":"v","w":"w","x":"x","y":"y","z":"z"
}
UpperList1 = {
  "A":0,"Z":25
}
UpperCaesar1 = {
  "A":"A","Z":"Z"
}
LowerList1 = {
  "a":0,"z":25

}
LowerCaesar1 = {
  "a":"a","z":"z"
}

Asker = int(input("Do you want to... 1. Encode,or 2. Decode? "))

if Asker == 1:
  Plaintext = str(input(""))
  OriginalShift = int(input(""))
  Shift = OriginalShift*-1
  UpperCaesar = shift_dict(UpperCaesar,Shift)
  LowerCaesar = shift_dict(LowerCaesar,Shift)
  Lister = []
  X = 0
  for i in range(len(Plaintext)):
    if Plaintext[X].isalpha():
      if Plaintext[X].isupper():
        Lister.append(UpperCaesar[Plaintext[X]])
      else:
        Lister.append(LowerCaesar[Plaintext[X]])
    else:
      Lister.append(Plaintext[X])
    X += 1
  print(*Lister,sep = "")
elif Asker == 2:
  Asker1 = int(input("Do you have the key (1),or not(2): "))
  if Asker1 == 1: 
    Plaintext = str(input(""))
    OriginalShift = int(input(""))
    Shift = OriginalShift*-1
    UpperCaesar = shift_dict(UpperCaesar,26 - Shift)
    LowerCaesar = shift_dict(LowerCaesar,26 - Shift)
    Lister = []
    X = 0
    for i in range(len(Plaintext)):
      if Plaintext[X].isalpha():
        if Plaintext[X].isupper():
          Lister.append(UpperCaesar[Plaintext[X]])
        else:
          Lister.append(LowerCaesar[Plaintext[X]])
      else:
        Lister.append(Plaintext[X])
      X += 1
    print(*Lister,sep = "")
  elif Asker1 == 2:
    Plaintext = str(input(""))
    OriginalShift = 0
    for i in range(26):
      UpperCaesar = shift_dict2(UpperCaesar,-1)
      LowerCaesar = shift_dict2(LowerCaesar,-1)
      Lister = []
      X = 0
      for i in range(len(Plaintext)):
        if Plaintext[X].isalpha():
          if Plaintext[X].isupper():
            Lister.append(UpperCaesar[Plaintext[X]])
          else:
            Lister.append(LowerCaesar[Plaintext[X]])
        else:
          Lister.append(Plaintext[X])
        X += 1
        time.sleep(0.01)
      print("With a shift of ",25 - (OriginalShift*-1),": ",*Lister,sep = "")
      OriginalShift -= 1