我正在尝试使用python制作一个“Caesar's Cipher”。这是我到目前为止所拥有的。谁能告诉我这是怎么回事?我正朝着正确的方向前进吗?我错过了什么?当我运行程序说例如(josh很酷)我没有得到同一行的密码。当我main(3)
m
r
v
k
l
v
f
r
r
o
但它将每个字母放在一个新行上。我怎么能这样做,以便它在一条线上?
def main(k):
if k<0 or k>231:
print "complaint"
raise SystemExit
Input = raw_input("Please enter Plaintext to Cipher")
for x in range(len(Input)):
letter=Input[x]
if letter.islower():
x=ord(letter)
x=x+k
if x>122:
x=x-122+97
print chr(x),
if letter.isupper():
x=ord(letter)
x=x+k
if x>90:
x=x-90+65
print chr(x),
答案 0 :(得分:6)
我喜欢kaizer.se的回答,但我想我可以使用string.maketrans函数简化它:
import string
first = raw_input("Please enter Plaintext to Cipher: ")
k = int(raw_input("Please enter the shift: "))
shifted_lowercase = ascii_lowercase[k:] + ascii_lowercase[:k]
translation_table = maketrans(ascii_lowercase, shifted_lowercase)
print first.translate(translation_table)
答案 1 :(得分:2)
此代码应该可以很好地工作。它还处理任意偏移,包括否定。
phrase = raw_input("Please enter plaintext to Cipher: ")
shift = int(raw_input("Please enter shift: "))
result = ''
for char in phrase:
x = ord(char)
if char.isalpha():
x = x + shift
offset = 65
if char.islower():
offset = 97
while x < offset:
x += 26
while x > offset+25:
x -= 26
result += chr(x)
print result
使用稍微不同的密码进行此操作的另一种方法是简单地旋转所有字符,上部和下部,或甚至所有ascii&gt;为0x20。
phrase = raw_input("Please enter plaintext to Cipher: ")
shift = int(raw_input("Please enter shift: "))
result = ''
for char in phrase:
x = ord(char)
x = x + shift
while x < 32:
x += 96
while x > 127:
x -= 96
result += chr(x)
print result
答案 2 :(得分:1)
在每个print语句后面加一个逗号;它仍然会在角色之间留出一个空格,但它们都会在同一条线上。如果您需要在没有空格的情况下打印它们,请将它们全部构建为一个字符串并在最后打印出来。
答案 3 :(得分:1)
这是一种不同的方法来展示我们如何以非常干净的方式处理这个问题。我们定义输入字母和输出字母,然后是转换表,并使用unicode.translate()
进行实际加密。
import string
# Blatantly steal Lennart's UI design
first = unicode(raw_input("Please enter Plaintext to Cipher: "), "UTF-8")
k = int(raw_input("Please enter the shift: "))
in_alphabet = unicode(string.ascii_lowercase)
out_alphabet = in_alphabet[k:] + in_alphabet[:k]
translation_table = dict((ord(ic), oc) for ic, oc in zip(in_alphabet, out_alphabet))
print first.translate(translation_table)
可以根据需要扩展为大写字母。
答案 4 :(得分:0)
除非出现语法错误,否则您的代码似乎有效。
然而,我冒昧地删除所有重复项并清理它:
first = raw_input("Please enter Plaintext to Cipher: ")
k = int(raw_input("Please enter the shift: "))
result = ''
for second in first:
x=ord(second)
x=x+k
if x>90 and x<122:
x=x-26
elif x>122:
x=x-26
result += chr(x)
print first
print result
“第一”和“第二”也是这些变量的坏名称。 “输入”和“字母”可能更好。
答案 5 :(得分:0)
我非常简单,没有变音符号的3班解决方案将是:
def caesar(inputstring):
shifted=string.lowercase[3:]+string.lowercase[:3]
return "".join(shifted[string.lowercase.index(letter)] for letter in inputstring)
并反向:
def brutus(inputstring):
shifted=string.lowercase[-3:]+string.lowercase[:-3]
return "".join(shifted[string.lowercase.index(letter)] for letter in inputstring)
使用它:
caesar("xerxes")
答案 6 :(得分:0)
对于Python 3.3,尝试使用ord(),chr()和.isalpha函数:
m = input("What is your message?: ")
s = int(input("What is the shift?: "))
for i in m:
if i.isalpha():
if (ord(i)+s)>90:
print(chr(ord(i)+s-26),end=""),
elif chr(ord(i)+s-26)<65:
print("The shift is invalid")
else:
print(chr(ord(i)+s),end=""),
else:
pass
答案 7 :(得分:0)
这是一个oneliner。
>>> brutus=lambda message,cipher,direction:''.join([chr((ord(letter)+(cipher*direction))%256) for letter in message])
>>> encrypted= brutus('Message to be encrypted',14,1) #direction=1 for encryption
>>> encrypted
'[s\x81\x81ous.\x82}.ps.s|q\x80\x87~\x82sr'
>>> brutus(encrypted,14,-1) # direction=-1 for decryption
'Message to be encrypted'
>>>