每个字母中的每个字母旋转列表



我正在尝试制作一个更改每个字母的键的凯撒密码,我目前有一个工作密码,一次拼命整个字符串,运行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

最新更新