我正在尝试制作一个更改每个字母的键的凯撒密码,我目前有一个工作密码,一次拼命整个字符串,运行1-25,但是我希望它能做它对于每个字母,如字符串" ABC"中的A将A,B升2和C升3,导致BDF
我已经有一个工作密码,只是不确定如何将每个字母更改。
upper = collections.deque(string.ascii_uppercase)
lower = collections.deque(string.ascii_lowercase)
upper.rotate(number_to_rotate_by)
lower.rotate(number_to_rotate_by)
upper = ''.join(list(upper))
lower = ''.join(list(lower))
return rotate_string.translate(str.maketrans(string.ascii_uppercase, upper)).translate(str.maketrans(string.ascii_lowercase, lower))
#print (caesar("This is simple", 2))
our_string = "ABC"
for i in range(len(string.ascii_uppercase)):
print (i, "|", caesar(our_string, i))
结果是:
0 | ABC
1 | ZAB
2 | YZA
3 | XYZ
4 | WXY
5 | VWX
6 | UVW
7 | TUV
8 | STU
9 | RST
10 | QRS
11 | PQR
12 | OPQ
13 | NOP
14 | MNO
15 | LMN
16 | KLM
17 | JKL
18 | IJK
19 | HIJ
20 | GHI
21 | FGH
22 | EFG
23 | DEF
24 | CDE
25 | BCD
我想要的是让第一个字母的1或0换档,然后是第二个字母,依此类推。
良好的努力!请注意,映射不仅重新排列字母,因此从未通过旋转字母来实现。在您的示例中,鞋面将成为以下映射:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
BDFHJLNPRTVXZBDFHJLNPRTVXZ
还请注意,此密码不容易可逆,即尚不清楚是否要反向'b' ->'a'或'b'或'b' ->'n'。
(旁注:如果我们将字母zabcdefghijklmnopqrstuvwxy视为数字0-25,则此密码乘以两个(在modulo 26中(: (x*2)%26
。密码永远是可逆的。您能看到为什么吗?提示:[1],[2]。(
当您对一块代码感到困惑时,通常是一个好兆头,是时候将其中一部分重构为单独的功能了,例如这样:
(游乐场:https://ideone.com/wnsadr(
import string
def letter_index(letter):
"""Determines the position of the given letter in the English alphabet
'a' -> 0
'A' -> 0
'z' -> 25
"""
if letter not in string.ascii_letters:
raise ValueError("The argument must be an English letter")
if letter in string.ascii_lowercase:
return ord(letter) - ord('a')
return ord(letter) - ord('A')
def caesar(s):
"""Ciphers the string s by shifting 'A'->'B', 'B'->'D', 'C'->'E', etc
The shift is cyclic, i.e. 'A' comes after 'Z'.
"""
ret = ""
for letter in s:
index = letter_index(letter)
new_index = 2*index + 1
if new_index >= len(string.ascii_lowercase):
# The letter is shifted farther than 'Z'
new_index %= len(string.ascii_lowercase)
new_letter = chr(ord(letter) - index + new_index)
ret += new_letter
return ret
print('caesar("ABC"):', caesar("ABC"))
print('caesar("abc"):', caesar("abc"))
print('caesar("XYZ"):', caesar("XYZ"))
输出:
caesar("ABC"): BDF
caesar("abc"): bdf
caesar("XYZ"): VXZ
资源:
- chr
- ord